Warum können In-Class-Initialisierer nur = oder {} verwenden? [duplicate]

Lesezeit: 2 Minuten

Warum konnen In Class Initialisierer nur oder verwenden duplicate
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?

1647086408 804 Warum konnen In Class Initialisierer nur oder verwenden duplicate
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 Overloadedda 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


993550cookie-checkWarum können In-Class-Initialisierer nur = oder {} verwenden? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy