以下 C++11 程序格式错误吗?
const int x[] = {1,2,3};
static_assert(x[0] == 1, "yay");
int main() {}
gcc 和 clang 似乎是这么认为的,但是为什么不是x[0] == 1
常量表达式呢?
x[0] == 1
subscript operator
*(x+0) == 1
array-to-pointer conversion (int* p = x)
*(p+0) == 1
pointer addition
*p == 1
indirection (lvalue y = x[0])
y == 1
lvalue-to-rvalue conversion:
整数(是的,它具有 const int 类型)或引用非易失性 const 对象的枚举类型(是的,它具有 const int 类型)的非易失性左值(是的,x[0] 是左值且非易失性)带有前面的初始化(是的,用 1 初始化),用常量表达式初始化(是的,1 是常量表达式)
似乎是真的,x
数组的第一个元素满足这些条件。
1 == 1
?
这是编译器错误、标准缺陷还是我遗漏了什么?
5.19 [expr.const] 的哪一部分说这不是一个常量表达式?