【发布时间】:2020-03-14 12:08:32
【问题描述】:
考虑这段代码:
#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;
| ~~~~~~~~~~~~~~~~^~~~
为什么?请注意,按位或在其他 constexpr 用例中工作正常,但不是这个。
【问题讨论】:
-
可能是因为这个特定的
uintptr_t的基因起源于一个指针。您可以向指针添加内容,但不能按位或向指针添加任何内容;对于constexpr,编译器实际上会尝试评估内容。 -
static constexpr uintptr_t result = (uintptr_t)&x;也失败了。 -
@Evg:确实如此。我现在想知道 GCC 是否试图拒绝 constexpr 中指针的所有使用,而
+不知何故让它忘记了。 -
我觉得this 也很有趣。
+ 1u编译,+ 0u不编译。
标签: c++ c++11 gcc g++ constexpr