La seguente è una citazione da Effective C++ moderno (pagina 55):Le parentesi graffe vuote chiamano il costruttore predefinito o il costruttore che prende una lista std :: initializer_list?
"Supponiamo di utilizzare un paio di graffe vuote per costruire un oggetto che supporta costruttore di default e supporta anche std :: initializer_list costruzione Cosa significano le tue parentesi vuote? Ecc. La regola è che ottieni la costruzione predefinita. "
ho provato questo con std :: array:
std::array<int, 10> arr{};
e ottenuto l'avvertimento da g ++ (versione 4.8.2):
avvertimento: inizializzatore per il membro mancante 'std: : array < int, 10ul> :: _ M_elems '
quale è l'avviso che si ottiene quando si tenta di costruire uno std::array
da un vuoto std::initializer_list
(vedere Why can I initialize a regular array from {}, but not a std::array per una discussione di questo avviso).
Quindi, perché la riga di codice precedente non è interpretata come chiamata al costruttore predefinito?
'std :: array' non ha costruttore che prende una' std :: initializer_list', e l'inizializzatore che hai qui non è neanche uno 'std :: initailizer_list'. Si riferisce a un elenco di init rinforzato. Non sono sicuro del motivo per cui ricevi un avviso, poiché l'uso di parentesi graffe dovrebbe valore-inizializzare l'array nidificato. – 0x499602D2
@ 0x499602D2 vedi la mia risposta alla domanda collegata, gcc era aggressivo e le versioni successive di gcc non producono l'avviso. –
Si noti inoltre che hanno cambiato lo standard C++ 11 in modo significativo in un DR. Lo standard attuale dice una cosa, ma i compilatori dovrebbero fare qualcosa di completamente diverso. – o11c