Является ли следующая программа С++ 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] говорит, что это не постоянное выражение?