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