Usa elenco inizializzazione quando l'elenco è generico e si potrebbe sostituire un altro contenitore, ad esempio una matrice, un aggregato o un vector
, senza alterarne il significato molto.
// "triplet" may be a struct, an array, or a std::vector,
// but it has at least single-precision floating-point values.
triplet dimensions { 5, 1.2f, static_cast<float>(M_PI) };
Se si sta costruendo una classe specifica con argomenti a un costruttore specifica, quindi parens vecchio stile sono più appropriati.
Una caratteristica unica di inizializzazione con a-init-list controventata è che non permette conversioni restringimento che potrebbero causare dati numerici di tale perdita, per esempio la parte frazionaria di un numero in virgola mobile o bit alti di un long
. Ciò aiuta a segnalare (o prevenire) gli errori risultanti dalla sostituzione di ad es. un tipo di array più ristretto durante il refactoring del codice.
Allo stesso modo, l'altro caso in cui x{ y }
è appropriato quando si esegue una conversione numerica con cui non si è in perdita. x(y)
proverà davvero a fare la conversione, anche ricorrendo a un reinterpret_cast
, e in genere dovrebbe essere evitato.
La terminologia "inizializzazione uniforme" è un po 'ottimistica e non appare nello standard. Non è appropriato per tutti i casi. Le parentesi indicano generalmente le liste, quindi è correttamente chiamata lista-inizializzazione. E questo è quando dovrebbe essere usato.
No, questo è un "perché" e questo è un "quando". Seriamente gente. – Potatoswatter
@Potatoswatter http://stackoverflow.com/questions/1863784/uniform-initialization-in-c0x-when-to-use-instead-of?rq=1 ecc. – Rapptz
@Rapptz OK, ora trovi quello con le risposte che fanno senso, o sono meglio di quello che ho aggiunto qui :) – Potatoswatter