Ich beobachte Bjarne Stroustrups Keynote zu C ++ 11 Style ( link ) (00:35:30) und habe Probleme beim Verständnis der folgenden (Code von der Folie kopiert):
%Vor% Ich habe versucht, diesen Code mit einer Struktur und einem Objekt zu kompilieren, aber in beiden Fällen sagt mir der Compiler, dass er ein ';' am Ende der Deklaration von Gadget g
und wird nicht kompiliert.
Meine Fragen sind daher:
g
instanziiert wird? Gadget
sein, damit dieser Code kompiliert werden kann? Gadget g {n};
? d. h. was sind die geschweiften Klammern nach der Deklaration? Darf ich annehmen, dass g instanziiert wird?
Ja, Sie haben Recht.
Welchen Objekttyp muss
Gadget
haben, damit dieser Code kompiliert werden kann?
Jeder Typ, der von int
initialisiert werden kann. Wenn zum Beispiel Ihre Gadget
-Klasse einen Konstruktor hat, der ein int
nimmt, oder etwas nimmt, das direkt von int
initialisiert werden kann, wird der Code kompiliert.
Welches Konzept funktioniert in dieser Zeile?
Gadget g {n};
? d. h. was sind die geschweiften Klammern nach der Deklaration?
Das ist eine einheitliche Initialisierungssyntax. Es beseitigt einige unangenehme Probleme mit der Klammernotation, die den C ++ - Compiler das folgende als eine Funktionsdeklaration parsen lassen würde (anstatt als die Initialisierung eines Objekts):
%Vor% Im obigen Beispiel bestand die Absicht des Programmierers möglicherweise darin, ein Objekt g
vom Typ Gadget
zu konstruieren und es von einem temporären Widget
-Objekt zu initialisieren: Der Compiler würde dies jedoch als Deklaration von eine Funktion namens g
, die ein Gadget
zurückgibt und als Argument eine (Zeiger auf a) Funktion annimmt, die keine Argumente akzeptiert und ein Widget
zurückgibt. Dies ist bekannt als das Most Vexing Parse Problem.
Beachten Sie, dass bei Verwendung von geschweiften Klammern das obige Problem nicht existiert:
%Vor%(wahrscheinlich zu breit, aber) Warum sollte der Compiler die geschweiften Klammern nicht als gültige Syntax erkennen?
Das liegt wahrscheinlich daran, dass Sie keinen C ++ 11-kompatiblen Compiler verwenden. Sie sollten eines verwenden und das Kompilierungsflag -std=c++11
oder -std=c++0x
verwenden, um C ++ 11-Unterstützung zu aktivieren.