Heim >Backend-Entwicklung >C++ >Warum sind klasseninterne Initialisierer auf geschweifte Klammern oder den Zuweisungsoperator beschränkt?
Mehrdeutigkeitsverhinderung bei In-Class-Initialisierern
Warum sind In-Class-Initialisierer darauf beschränkt, in geschweifte Klammern eingeschlossen zu werden oder das zu verwenden? Zuweisungsoperator (=)? Im Gegensatz zu Methodendeklarationen, die Klammern verwenden können, müssen klasseninterne Initialisierer diese spezifische Syntax einhalten.
Begründung für die Einschränkung
Diese Einschränkung soll potenzielle Syntaktiken umgehen Mehrdeutigkeit. Betrachten Sie die folgende Klassendefinition:
class BadTimes { struct Overloaded; int Overloaded; // Strange but legal data member int confusing(Overloaded); // Function declaration or data member initialization? };
Wenn Klammern für klasseninterne Initialisierer zulässig wären, würde dieser Code zu Mehrdeutigkeiten führen. Einerseits die Zeile „int confusing(Overloaded);“ könnte als Funktionsdeklaration interpretiert werden, die einen Parameter vom Typ Overloaded akzeptiert und einen int zurückgibt. Andererseits könnte es auch als Datenelementinitialisierung vom Typ int mit dem Wert des überladenen Datenelements gelesen werden. (Dies bezieht sich auf das berüchtigte „Most Vexing Parse“-Problem.)
Beseitigung von Mehrdeutigkeiten mit geschweiften Klammern
Durch die Durchsetzung der Verwendung von geschweiften Klammern wird diese Mehrdeutigkeit beseitigt:
class BadTimes { struct Overloaded; int Overloaded; // Strange but legal data member int confusing{Overloaded}; // Clearly a data member initialization };
Jetzt ist es offensichtlich, dass Verwirren ein Int ist explizit auf den Wert von Overloaded initialisiert, da es keinen Spielraum für die Interpretation als Funktionsdeklaration gibt.
Diese Syntaxeinschränkung sorgt für klare und eindeutige Klassendefinitionen und verhindert unbeabsichtigte Folgen aufgrund syntaktischer Verwirrung.
Das obige ist der detaillierte Inhalt vonWarum sind klasseninterne Initialisierer auf geschweifte Klammern oder den Zuweisungsoperator beschränkt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!