2013-08-15 20 views
6

In C++11 è possibile inizializzare un struct utilizzando l'inizializzazione uniforme come di seguito:Quando dovrei usare l'inizializzazione uniforme?

struct BasicStruct { 
    BasicStruct (int x, double y) : x_{x}, y_{y} {} 

private: 
    int x_; 
    double y_; 
}; 

BasicStruct var1{5, 3.2}; 

Domande:

  1. Quando devo usare questa sintassi BasicStruct var1{5, 3.2} invece di chiamare il costruttore come BasicStruct var1(5, 3.2)?

  2. Quando è necessario inizializzare un attributo come x_{x} anziché il vecchio modo di moda x_(x)?

+2

No, questo è un "perché" e questo è un "quando". Seriamente gente. – Potatoswatter

+0

@Potatoswatter http://stackoverflow.com/questions/1863784/uniform-initialization-in-c0x-when-to-use-instead-of?rq=1 ecc. – Rapptz

+0

@Rapptz OK, ora trovi quello con le risposte che fanno senso, o sono meglio di quello che ho aggiunto qui :) – Potatoswatter

risposta

4

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.

Problemi correlati