Joh*_*nck 7 c++ gcc g++ constexpr c++11
考虑以下代码:
#include <cstdint>
static int x = 0;
const uintptr_t arithmetic()
{
static constexpr uintptr_t result = ((uintptr_t)&x) + 1u;
return result;
}
const uintptr_t bitwise()
{
static constexpr uintptr_t result = ((uintptr_t)&x) | 1u;
return result;
}
Run Code Online (Sandbox Code Playgroud)
GCC(所有版本4-9)都arithmetic()
可以正常编译,但可以拒绝bitwise()
:
<source>: In function 'const uintptr_t bitwise()':
<source>:13:57: error: '(((uintptr_t)(& x)) | 1)' is not a constant expression
13 | static constexpr uintptr_t result = ((uintptr_t)&x) | 1u;
| ~~~~~~~~~~~~~~~~^~~~
Run Code Online (Sandbox Code Playgroud)
为什么?请注意,在其他constexpr用例中,按位-或工作正常,但不是这种情况。
您根本不能在常量表达式中使用\xe2\x80\x99 reinterpret_cast
(或执行此操作的 C 风格转换)。GCC 要么有一个强制执行的错误,要么试图帮助支持一些实际用例,其中+
但不|
相关。