2013-06-27 5 views
5

Update2:Mangel an Compiler-Warnung mit falscher Klammer initializer

Wie vermutet, dies muss nicht mit mit einem Initialisiererliste Konstruktor zu tun. Mit dem Kommentar von R. Martinho Fernandes ist es klar, dass es nur ein Objekt mit einer Kopie von sich selbst zu konstruieren versucht, die nicht erkannt wird, wenn Klammer Syntax:

struct C{ 
    C(){} 
}; 
struct D{ 
    C c0{c0}; // << -- compiles without warning 
    C c1(c1); // << -- does not compile 
}; 

Es bleibt die Frage. Wird für diesen Fall eine Diagnose vom Standard gefordert? Ich weiß, dass eine Diagnose für alle Arten von Fehlern nicht möglich oder praktisch ist.

Ich habe dies gemeldet, als Bug 57758.

Original Frage:

Jemand, den ich gut kenne fehlerhaften Code schreiben verwaltet (verursacht durch reine Tippfehler), die schließlich unechte bad_alloc Ausnahmen erzeugt. Ich frage mich, ob es einen guten Grund gibt, warum gcc (4.7.2 und 4.8.1) nicht davor warnt.

Wird für diesen Fall eine Diagnose vom Standard verlangt? Ich weiß, dass eine Diagnose für alle Arten von Fehlern nicht möglich oder praktisch ist.

Dies ist, was es läuft darauf hinaus:

#include <initializer_list> 
struct A{}; 
struct C{ 
    C(std::initializer_list<A*> as){} 
}; 
struct D{ 
    C c{c}; // <<- well... 
};  
int main(){ 
    D d; 
} 

Edit: Der Grund, warum ich initializer_list erwähnen, dass, wenn ich die Initialisiererliste Konstruktor entfernen ich tun einen Fehler: error: too many initializers for ‘C’

Was ich denke, ist verursacht durch die Tatsache, dass, da es keinen benutzerdefinierten Konstruktor (user deklariert?) gibt, bekomme ich Aggregat-Initialisierung, die nicht funktioniert, da es kein Mitglied (von Typ C) in C

+1

Wie ist die Beziehung zu initializer_lists? Dies ist nur eine Kopie von einer nicht initialisierten Variable. –

+0

was würde c {c} bedeuten? –

+0

Da c kein 'A *' ist, bedeutet es eine Kopie. –

Antwort

1

Clang ++ hat das gleiche Verhalten . Sie übergeben den Wert c0, wenn es in den Standardkopiekonstruktor nicht initialisiert wird, ohne eine Warnung "nicht initialisiert, wenn hier verwendet" zu erhalten. (Schreiben Sie einen privaten Kopierkonstruktor zur Bestätigung.)

Ich denke, was passiert ist direct-list-initialization. Ich weiß nicht, ob eine Diagnose vom Standard verlangt wird, aber es lohnt sich, einen Fehlerbericht zu erstellen.

Verwandte Themen