Poniżej cytat z skutecznych, nowoczesnych C++ (strona 55):Czy puste nawiasy wywołują domyślny konstruktor lub konstruktor pobierający std :: initializer_list?
„Załóżmy, że używasz pusty zestaw szelki do budowy obiektu, który obsługuje domyślnego konstruktora a także obsługuje std :: initializer_list budowę Co oznaczają puste klamry? Itp. Zasadą jest, że otrzymujesz domyślną konstrukcję. "
Próbowałem to z std :: tablicy:
std::array<int, 10> arr{};
i dostał ostrzeżenie od g ++ (wersja 4.8.2):
ostrzegawczy: brakuje inicjator dla członka „std: : array < int, 10ul> :: _ M_elems '
co jest ostrzeżeniem, które pojawia się przy próbie zbudowania std::array
z pustego std::initializer_list
(zobacz Why can I initialize a regular array from {}, but not a std::array, aby uzyskać omówienie tego ostrzeżenia).
Dlaczego więc powyższy wiersz kodu nie jest interpretowany jako wywołujący domyślny konstruktor?
'std :: array' nie ma konstruktora pobierającego' std :: initializer_list', a inicjator, który tu masz, nie jest też 'std :: initailizer_list'. Jest to lista wzmocniona-inicjująca. Nie jestem pewien, dlaczego otrzymujesz ostrzeżenie, ponieważ używanie pustych klamerek powinno być wartościowe - zainicjuj zagnieżdżoną tablicę. – 0x499602D2
@ 0x499602D2 zobacz moją odpowiedź na powiązane pytanie, gcc był agresywny, a późniejsze wersje gcc nie generują ostrzeżenia. –
Należy również zauważyć, że zmienili standard C++ 11 w znaczący sposób w środowisku DR. Rzeczywisty standard mówi jedno, ale od kompilatorów oczekuje się czegoś zupełnie innego. – o11c