GCC constexpr允许添加但不允许按位或带有地址

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用例中,按位-或工作正常,但不是这种情况。

演示:https//godbolt.org/z/x5jbuU

Dav*_*ing 4

您根本不能在常量表达式中使用\xe2\x80\x99 reinterpret_cast(或执行此操作的 C 风格转换)。GCC 要么有一个强制执行的错误,要么试图帮助支持一些实际用例,其中+但不|相关。

\n

  • @JohnZwinck:这只是显示了永远不能在常量表达式中调用的 constexpr 函数不需要诊断;此类呼叫的尝试会被拒绝。 (3认同)