考虑下面的代码:
#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;
}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;
| ~~~~~~~~~~~~~~~~^~~~为什么?请注意,在其他常量表达式用例中,按位或可以很好地工作,但在这个用例中就不行。
发布于 2019-11-22 14:33:58
根本不能在常量表达式中使用reinterpret_cast (或执行此操作的C风格的强制转换)。GCC要么有一个强制执行的bug,要么是试图帮助支持一些与+相关而不是|相关的实际用例。
https://stackoverflow.com/questions/58926138
复制相似问题