Pierwszy fragment zestawia bez ostrzeżeń (live example)Dlaczego te fragmenty są inaczej obsługiwane przez GCC?
#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';
}
teraz zmieniać powyższy fragment powracając i
w operatorze konwersji (live example):
constexpr operator int() { return i; }
GCC ostrzega b
jest VLA .
Dla mnie oba warianty wydają się być zgodne z paragrafem § 5.19 [wyrażenie.konst.]/3 w C++ 14.
Dlaczego "a" musi w tym przypadku zostać poddane konwersji L-Value-to-R? Pytam o to, ponieważ definicja "przekonwertowanego wyrażenia stałego" w §5.19/3 (N4140) nie wymaga takiej konwersji z "a" w deklaracji 'int b [a] {0, 1 , 2, 3, 4}; '. – Ayrosa
@Ayrosa Cóż, 'a' nigdy nie musi podlegać jednemu, ale musi zostać wywołany operator konwersji, aby przekonwertować go na' std :: size_t'. ('a' jest skonwertowanym wyrażeniem stałym typu' std :: size_t' wewnątrz nawiasów) – Columbo
Zajęło mi trochę czasu, aby naprawdę zrozumieć, co powiedziałeś i podświetliłeś w swojej odpowiedzi.Zdecydowanie nie jest to łatwe zadanie dla pełnego zrozumienia Standardu. Świetna odpowiedź (+1). – Ayrosa