2016-04-19 38 views
9

Ich bin vertraut mit geschweiften Klammern/initializer Listen mit Verengung zu verhindern, wenn eine Variable initialisiert wird, aber ist es gute Praxis, es zu benutzen, wenn ein Wert eine Zuordnung variabel auch?C++: geschweiften Klammern Verengung bei der Zuordnung zu verhindern

Für z.B.

int i{1};  // initialize i to 1 
double d{2.0}; // initialize d to 2.0 
i = {2};  // assign value 2 to i 
i = {d};  // error: narrowing from double to int 

Gibt es einen Grund, geschweifte Klammern für die Zuweisung nicht zu verwenden?

+5

Wenn Sie sich verengen möchten? – xaxxon

+0

Ich würde sagen: Verwenden Sie sie nicht in Zuordnungen – Exceptyon

+0

Haben Sie eine Lektüre von: https://herbsutter.com/2013/05/09/gotw-1-solution/ und möglicherweise https://herbsutter.com/2013/ 08/12/gotw-94-solution-aaa-style-fast-immer-auto / –

Antwort

2

Ist kein Problem der Initialisierung vs Zuweisung.

Es ist ein Problem der verschiedenen Arten. Wenn Sie versuchen, eine int Variable mit einer double zu initialisieren, erhalten Sie den gleichen Fehler.

Und Sie können {d} zu einem anderen double Variable zuweisen.

int main() 
{ 
    int i{1};  // initialize i to 1 
    //int i2{3.0}; // ERROR! 
    double d{2.0}; // initialize d to 2.0 
    double d2{1.0}; // initialize d2 to 1.0 
    i = {2};  // assign value 2 to i 
    //i = {d};  // error: narrowing from double to int 
    d2 = {d};  // OK 

    return 0; 
} 

Ihr Beispiel, angereichert.

Eine gute Übung, wenn Sie einen Wert zuweisen? Kann sein, wenn Sie sicher sein wollen, die Präzision nicht zu verlieren.

Ein Beispiel: Sie können

template <typename X, typename Y> 
void assign (X & x, Y const & y) 
{ x = {y}; } 

Sie sicher sind, also zu vermeiden Verengung

// i is of type int 
assign(i, 23); // OK 
assign(i, 11.2); // ERROR! 

Wenn (wenn) Verengung ist eine Vorlage assign() Funktion auf diese Weise schreiben kein Problem, das Sie, kann die geschweiften Klammern vermeiden.