次の 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[0] は glvalue であり、不揮発性です) (はい、型 const int を持ちます) または不揮発性 const オブジェクトを参照する列挙型 (はい、型 const int を持ちます)先行する初期化 (はい 1 で初期化)、定数式で初期化 (はい 1 は定数式)
確かに、x
配列の最初の要素はこれらの条件を満たしています。
1 == 1
?
これはコンパイラのバグですか、標準的な欠陥ですか、それとも何か不足していますか?
5.19 [expr.const] のどの部分で、これは定数式ではないと述べていますか?