C ++ Deklaration und Instanziierung von Bereichsvariablen mit geschweiften Klammern anstelle des Zuweisungsoperators

8

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:

  • Darf ich annehmen, dass g instanziiert wird?
  • Welcher Objekttyp muss Gadget sein, damit dieser Code kompiliert werden kann?
  • Welches Konzept funktioniert in dieser Zeile: Gadget g {n}; ? d. h. was sind die geschweiften Klammern nach der Deklaration?
  • (wahrscheinlich zu breit, aber) Warum würde der Compiler die geschweiften Klammern nicht als gültige Syntax erkennen?
svrs 24.05.2013, 10:57
quelle

1 Antwort

14
  

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.

    
Andy Prowl 24.05.2013, 11:10
quelle

Tags und Links