In-Class-Initialisierer (C++11-Funktion) muss in geschweiften Klammern eingeschlossen sein oder auf ein =-Zeichen folgen. Sie dürfen nicht in Klammern angegeben werden.
Was ist der Grund dafür?
7 Kühe
In-Class-Initialisierer (C++11-Funktion) muss in geschweiften Klammern eingeschlossen sein oder auf ein =-Zeichen folgen. Sie dürfen nicht in Klammern angegeben werden.
Was ist der Grund dafür?
Vorlagentypdef
Ich bin nicht zu 100% positiv, aber dies könnte dazu dienen, eine Syntaxmehrdeutigkeit zu verhindern. Betrachten Sie beispielsweise die folgende Klasse:
class BadTimes {
struct Overloaded;
int Overloaded; // Legal, but a very strange idea.
int confusing(Overloaded); // <-- This line
};
Was bedeutet die angezeigte Zeile? Wie geschrieben, ist dies eine Deklaration einer Member-Funktion namens confusing
die als Parameter ein Objekt vom Typ akzeptiert Overloaded
(dessen Name nicht in der Funktionsdeklaration angegeben ist) und gibt eine zurück int
. Wenn C++11 Initialisierern erlauben würde, Klammern zu verwenden, wäre dies mehrdeutig, da es sich auch um eine Definition eines Typmembers handeln könnte int
genannt confusing
die mit dem Wert des Datenmembers initialisiert wird Overloaded
. (Dies hängt mit dem aktuellen Problem mit der Das ärgerlichste Parsen.)
Durch das Erfordernis von geschweiften Klammern wird diese Mehrdeutigkeit beseitigt:
class BadTimes {
struct Overloaded;
int Overloaded; // Legal, but a very strange idea.
int confusing{Overloaded}; // <-- This line
};
Nun, das ist klar confusing
ist eigentlich ein int
initialisiert auf den Wert von Overloaded
da es keine Möglichkeit gibt, es als Funktionsdeklaration zu lesen.
Hoffe das hilft!
Das macht für mich Sinn, aber wir haben diese Verwirrung zum Beispiel bereits in einem Funktionskörper. Warum sollte es hier anders sein?
– Rakete1111
10. Mai 2018 um 9:29 Uhr
@ Rakete111 In einem Funktionskörper, IIRC wegen der ärgerlichsten Analyse der Anweisung int confusing(Overloaded)
würde eher als Funktionsprototyp als als Variablendeklaration behandelt, daher denke ich, dass das Verhalten konsistent ist. Die Verwendung von Klammern für die Initialisierung ist historisch, und es wurden teilweise neue, auf geschweiften Klammern basierende Initialisierer entwickelt, um die Mehrdeutigkeiten der älteren Syntax zu vermeiden.
– Vorlagentypdef
10. Mai 2018 um 15:18 Uhr
Es gibt keine Zweideutigkeit, in allen Ihren beschriebenen Fällen Overloaded
bezieht sich auf int
, und es findet keine lästige Analyse statt. Dies beantwortet die Frage IMO nicht
– Passant
12. Mai 2018 um 21:51 Uhr