下面的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:
非易失性glvalue (是的,x是glvalue且非易失性的)整数(是的,它具有const int类型)或枚举类型,引用具有先前初始化(是的,用1初始化)的非易失性const对象(是的,它具有const int类型),用常量表达式初始化(yes 1是常量表达式)
看起来是真的,x
数组的第一个元素满足这些条件。
1 == 1
这是一个编译器错误,标准缺陷,还是我遗漏了什么?
5.19 expr.const的哪个部分说这不是一个常量表达式?
https://stackoverflow.com/questions/18903113
复制相似问题