首页 > 后端开发 > C++ > 正文

为什么初始化'constexpr”变量时'reinterpret_cast”会导致编译错误?

Mary-Kate Olsen
发布: 2024-11-13 04:37:02
原创
763 人浏览过

Why Does `reinterpret_cast` Cause a Compilation Error When Initializing a `constexpr` Variable?

constexpr 和 reinterpret_cast:C 编译出错

考虑以下代码片段:

<br>struct foo {<br> static constexpr const void<em> ptr = reinterpret_cast<const void</em>>(0x1);<br>};<br>

此代码在 g v4.9 中编译没有错误,但是在 clang v3.4 中失败错误:

error: constexpr variable 'ptr' must be initialized by a constant expression
登录后复制

哪个编译器是正确的?

根据 C 11 标准,clang 是正确的。该标准规定常量表达式不得涉及reinterpret_cast。这意味着代码片段中 ptr 的初始化无效。

正确的初始化

声明这种类型的表达式的正确方法是使用替代方法方法,如:

<br>struct foo {<br> static constexpr intptr_t ptr = 0x1;<br>};<br>
登录后复制

这在 clang 和 g 中都有效。

GCC 的解决方法

虽然 GCC 对原始代码片段的接受在技术上是不正确的,但它确实支持使用 __builtin_constant_p 宏的解决方法:

<br>struct foo {<br> static constexpr const void* ptr =</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">__builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ?
  reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1);
登录后复制

};
< ;/pre>

此解决方法允许 GCC折叠非常量表达式并将其视为常量。不过,它不是 C 标准的一部分,应谨慎使用。

以上是为什么初始化'constexpr”变量时'reinterpret_cast”会导致编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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