Klasseninterne Initialisierer: Warum die Klammer-oder-Gleich-Einschränkung?
In C 11 müssen klasseninterne Initialisierer einer bestimmten Syntax entsprechen : Sie müssen entweder in geschweifte Klammern eingeschlossen sein oder direkt auf ein Gleichheitszeichen (=) folgen. Die Verwendung von Klammern ist jedoch nicht zulässig. Es ist von entscheidender Bedeutung, die Gründe für diese Anforderung zu verstehen.
Verhindern von Syntaxmehrdeutigkeiten
Die Einschränkung ergibt sich aus der Möglichkeit einer Syntaxmehrdeutigkeit. Betrachten Sie die folgende Klasse:
class AmbiguousSyntax { struct Overloaded; int Overloaded; int confusing(Overloaded); };
Zeile 4 ist mehrdeutig, wenn Klammern für klasseninterne Initialisierer zulässig wären. Es könnte möglicherweise entweder als Deklaration einer Mitgliedsfunktion namens „confusing“ interpretiert werden, die einen Parameter vom Typ „Overloaded“ akzeptiert, oder als Definition einer „int“-Mitgliedsvariablen „confusing“, die mit dem Wert des Datenelements „Overloaded“ initialisiert wird.
Klarheit durch Klammern
Durch die Forderung nach geschweiften Klammern für klasseninterne Initialisierer, C 11 beseitigt diese Mehrdeutigkeit. Änderung des vorherigen Beispiels:
class AmbiguousSyntax { struct Overloaded; int Overloaded; int confusing{Overloaded}; };
Jetzt ist klar, dass „confusing“ ein ganzzahliges Element ist, das mit dem Wert „Overloaded“ initialisiert wurde, da die Verwendung von Klammern für Funktionsparameter nicht zulässig ist.
Diese Syntaxeinschränkung in C 11 gewährleistet eine klare Unterscheidung zwischen Funktionsdeklarationen und Mitgliedsvariablendeklarationen/-initialisierungen, wodurch die Lesbarkeit des Codes verbessert und Verwirrung bei der Interpretation vermieden wird von klasseninternen Initialisierern.
Das obige ist der detaillierte Inhalt vonWarum können In-Class-Initialisierer von C 11 keine Klammern verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!