首页 > 后端开发 > C++ > 可以使用'reinterpret_cast”来初始化'constexpr”静态 const void 指针吗?

可以使用'reinterpret_cast”来初始化'constexpr”静态 const void 指针吗?

Patricia Arquette
发布: 2024-11-30 03:19:10
原创
957 人浏览过

Can `reinterpret_cast` be used to initialize a `constexpr` static const void pointer?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板