7

Ich schreibe eine generische Funktion wie unten.C++ über generische Initialisierung in Vorlagen

template<class Iterator, class T> 
void foo(Iterator first, Iterator last) { 
    T a; 
    cout << a << endl; 
    // do something with iterators 
} 

typedef vector<double>::iterator DblPtr; 
vector<double> values; 
foo< DblPtr, int>(); 

Diese Funktion druckt einen nicht definierten Wert für die Variable a aus, während, wenn ich die Initialisierung in

/// 
    T a = T() 
    cout << a << endl; 
    // do something with iterators 

ich, dass der initialisierte Wert sehen ändern ist 0 wie ich erwarte.

Wenn ich rufe T a die Variable mit dem Standardwert initialisiert wird, aber wenn ich T a = T() nenne ich glaube, dass durch die Kopie Konstruktor sollte die Optimierung mit dem Wert von T() aufgerufen werden, die eine noch die Standardeinstellung.

Ich kann nicht verstehen, was ist der Unterschied hinter diesen 2 Zeilen und der Grund, warum dies passiert?

Antwort

11

Vor allem die Standardinitialisierung von integrierten Typen wie int lässt sie nicht initialisiert. Wert Initialisierung lässt sie Null-initialisiert. Wie für Ihr Beispiel

Dies ist eine Standard-Initialisierung:

T a; 

Dies ist ein Wert Initialisierung ist, mit copy initialization:

T a = T(); 

Sie haben Recht, dass Kopien hier elided werden kann, so hat dies der Effekt der Erstellung eines einzelnen Wertes initialisiert T Objekt. Es ist jedoch erforderlich, dass T kopierbar oder kopierfähig ist. Dies ist der Fall bei eingebauten Typen, aber es ist eine Einschränkung, die zu beachten ist.

Die Kopie Initialisierung Syntax erforderlich ist, da dies eine Erklärung Funktion:

T a(); 

aber C++ 11 ermöglicht es Ihnen, Wert initialisieren wie folgt aus:

T a{}; 
+0

Große Erklärung! Alles klar jetzt und vielen Dank. –