Первый фрагмент компиляции без каких-либо предупреждений (живой пример):
#include <iostream>
struct A {
constexpr A(): i(5){}
constexpr operator int() { return 5; }
int i;
};
int main() {
A a;
int b[a]{ 0, 1, 2, 3, 4 };
std::cout << b[4] << '\n';
}
Теперь измените приведенный выше фрагмент, вернув i
в оператор преобразования (живой пример):
constexpr operator int() { return i; }
GCC предупреждает, что b
является VLA.
Для меня оба варианта, похоже, соответствуют пункту §5.19 [expr.const]/3 в С++ 14.