2013-12-22 9 views
24

Hier sind zwei Möglichkeiten, eine Variable in C++ 11 zu initialisieren:Beeinflusst das Gleichheitszeichen die Klammerinitialisierung? z.B. 'T a = {}' vs 'T a {}'

T a {something}; 
T a = {something}; 

ich diese beiden in allen Szenarien getestet ich und ich denken konnte, gescheitert, einen Unterschied zu bemerken. This answer legt nahe, dass es einen feinen Unterschied zwischen den beiden ist:

Für Variablen Ich habe nicht viel Aufmerksamkeit zwischen den T t = { init }; oder T t { init }; Arten zahlen, finde ich den Unterschied gering zu sein und wird im schlimmsten Fall nur zu einer hilfreich Compiler-Nachricht über den Missbrauch eines expliziten Konstruktors.

Also, gibt es einen Unterschied zwischen den beiden?

Antwort

19

Der einzige wesentliche Unterschied ich weiß, ist bei der Behandlung von explicit Bauer:

struct foo 
{ 
    explicit foo(int); 
}; 

foo f0 {42}; // OK 
foo f1 = {42}; // not allowed 

Dies ist vergleichbar mit der "traditionellen" Initialisierung:

foo f0 (42); // OK 
foo f1 = 42; // not allowed 

See [over.match.list]/1.


aus, dass abgesehen, gibt es einen Defekt (siehe CWG 1270) in C++ 11, die nur für die Form T a = {something}

struct aggr 
{ 
    int arr[5]; 
}; 

aggr a0 = {1,2,3,4,5}; // OK 
aggr a1 {1,2,3,4,5}; // not allowed 
+0

Does not a = {etwas} auch führt Klammer-elision ermöglicht in eine extra Kopie/Umzug? – gvd

+5

@gvd Nein, hier unterscheiden sich "traditionelle" copy-init und copy-list-init: 'foo f0 = 42;' konvertiert '42' in einen prvalue-temporären 'foo' und initialisiert' f0' mit diesem temporären (über eine möglicherweise entfernte Kopie/move), wobei 'foo f1 = {42};' 'einen Konstruktor von' f1' auswählt, der mit '42' aufgerufen wird (die Kopie + move ctor kann in diesem Fall gelöscht werden). – dyp