constexpr 和使用reinterpret_cast 初始化静态 const void 指针:编译器差异解释
在给定的代码片段中,一个 static constexpr const void指针是使用reinterpret_cast 声明的。此代码提出了一个问题,即根据标准和声明此类表达式的正确方法,哪种编译器解释是正确的。
编译器正确性
标准规定 constexpr变量(例如本例中的 static const void 指针)必须使用常量表达式进行初始化。然而,根据 C 11 标准,reinterpret_cast 表达式不被视为核心常量表达式。因此,clang 是正确的 报告此代码的错误。
正确的声明
要正确声明 static constexpr const void 指针,有有几个选项:
使用 intptr_t 代替: 使用 intptr_t 类型并在检索值时将其转换为 void 指针,如下所示:
static constexpr intptr_t ptr = 0x1; // ... reinterpret_cast<void*>(ptr);
GCC/clang 扩展: GCC 和 clang 支持使用 __builtin_constant_p 的文档很少的扩展:
static constexpr const void* ptr = __builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1) ;
这个两个编译器都会对表达式进行常量折叠。但请注意,此扩展不是标准的一部分,未来版本的编译器可能不支持。
以上是使用reinterpret_cast 初始化静态constexpr const void 指针是否合法?的详细内容。更多信息请关注PHP中文网其他相关文章!