Heim >Backend-Entwicklung >C++ >Warum erlauben In-Class-Initialisierer von C 11 keine Klammern?
Mehrdeutigkeit in Klasseninitialisierern: Die Rolle von geschweiften Klammern und Gleichheitszeichen
In C 11 können klasseninterne Memberinitialisierer nur mit Curly definiert werden Klammern ({}) oder das Gleichheitszeichen (=). Diese Einschränkung wirft die Frage auf, warum Klammern für diesen Zweck nicht zulässig sind.
Ein Hauptgrund für diese Einschränkung liegt in der Möglichkeit einer Mehrdeutigkeit der Syntax. Betrachten Sie die folgende Klasse:
class BadTimes { public: struct Overloaded; int Overloaded; // Data member int confusing(Overloaded); // Function declaration };
Wenn Klammern für Initialisierer zulässig wären, würde die Zeile „int confusing(Overloaded);“ könnte mehrdeutig sein. Es könnte entweder als Funktionsdeklaration (wie oben gezeigt) oder als Initialisierung einer Mitgliedsvariablen interpretiert werden, wenn Klammern für den Initialisierer verwendet würden:
int confusing{Overloaded};
Um diese Mehrdeutigkeit zu beseitigen, sind geschweifte Klammern oder das Gleichheitszeichen erforderlich . Dadurch wird sichergestellt, dass es keine Verwechslungen zwischen Initialisierern von Mitgliedsvariablen und Funktionsdeklarationen gibt:
class BadTimes { public: struct Overloaded; int Overloaded; int confusing{Overloaded}; // Member variable initialized with Overloaded };
Das obige ist der detaillierte Inhalt vonWarum erlauben In-Class-Initialisierer von C 11 keine Klammern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!