以下C++ 11程序是否格式错误?
const int x[] = {1,2,3};
static_assert(x[0] == 1, "yay");
int main() {}
Run Code Online (Sandbox Code Playgroud)
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:
Run Code Online (Sandbox Code Playgroud)
一个非易失性glvalue(是的,x [0]是glvalue和非易失性)的整数(是的,它有类型const int)或枚举类型引用一个非易失性的const对象(是的它有类型const int)使用前面的初始化(是初始化为1),使用常量表达式初始化(是1是常量表达式)
似乎是真的,x数组的第一个元素满足这些条件.
1 == 1
Run Code Online (Sandbox Code Playgroud)
?
这是编译器错误,标准缺陷,还是我错过了什么?
5.19 [expr.const]的哪一部分说这不是一个常量表达式?