首页 >后端开发 >C++ >使用reinterpret_cast 初始化静态constexpr const void 指针是否合法?

使用reinterpret_cast 初始化静态constexpr const void 指针是否合法?

Linda Hamilton
Linda Hamilton原创
2024-11-12 03:35:01981浏览

Is it legal to initialize a static constexpr const void pointer using reinterpret_cast?

constexpr 和使用reinterpret_cast 初始化静态 const void 指针:编译器差异解释

在给定的代码片段中,一个 static constexpr const void指针是使用reinterpret_cast 声明的。此代码提出了一个问题,即根据标准和声明此类表达式的正确方法,哪种编译器解释是正确的。

编译器正确性

标准规定 constexpr变量(例如本例中的 static const void 指针)必须使用常量表达式进行初始化。然而,根据 C 11 标准,reinterpret_cast 表达式不被视为核心常量表达式。因此,clang 是正确的 报告此代码的错误。

正确的声明

要正确声明 static constexpr const void 指针,有有几个选项:

  1. 使用 intptr_t 代替: 使用 intptr_t 类型并在检索值时将其转换为 void 指针,如下所示:

    static constexpr intptr_t ptr = 0x1;
    // ...
    reinterpret_cast<void*>(ptr);
  2. 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn