Heim >Backend-Entwicklung >C++ >Warum sind klasseninterne Initialisierer auf geschweifte Klammern oder den Zuweisungsoperator beschränkt?

Warum sind klasseninterne Initialisierer auf geschweifte Klammern oder den Zuweisungsoperator beschränkt?

DDD
DDDOriginal
2024-12-21 06:43:14478Durchsuche

Why Are In-Class Initializers Restricted to Curly Braces or the Assignment Operator?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn