constexpr 和使用重新解释强制转换静态 const Void 指针的初始化:编译器差异
以下代码片段说明了该问题:
struct foo { static constexpr const void* ptr = reinterpret_cast<const void*>(0x1); };
编译器差异
虽然此代码在 g v4.9 中编译成功,但在 clang v3.4 中编译失败。 Clang 生成错误:
error: constexpr variable 'ptr' must be initialized by a constant expression
标准合规性
根据 C 11 标准, constexpr 变量必须由常量表达式初始化。正如 C 11 标准草案第 5.19 节第 2 段所述,Reinterpret_cast 不是常量表达式。因此,clang 拒绝代码是正确的。
正确声明
使用重新解释强制转换声明 constexpr 变量的正确方法是使用 __builtin_constant_p 宏。该宏允许非常量表达式的常量折叠。以下修改后的代码可以在 g 和 clang 中编译:
static constexpr const void* ptr = __builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1) ;
此代码使用三元条件运算符来测试重新解释的强制转换表达式是否为常量表达式。如果 true,则执行强制转换,否则评估失败。
以上是可以使用'reinterpret_cast”来初始化'constexpr”静态 const void 指针吗?的详细内容。更多信息请关注PHP中文网其他相关文章!