Designierte Initialisierer in C 20: Initialisierung abgeleiteter Klassen
Designierte Initialisierer, die in C 20 eingeführt wurden, ermöglichen eine präzise Initialisierung von Klassenmitgliedern mit eine designierte Initialisierungsliste. Eine aktuelle Frage wirft jedoch Licht auf ein unerwartetes Verhalten bei abgeleiteten Klassen.
Frage:
Der folgende Code veranschaulicht das Problem:
<code class="cpp">struct Person { std::string name{}; std::string surname{}; unsigned age{}; }; struct Employee : Person { unsigned salary{10000}; }; int main() { Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // Ok Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // Doesn't compile Employee e2{.salary{55000}}; // Warning: missing initializer for base class }</code>
Warum schlägt die Initialisierung von Employee mit bestimmten Initialisierern fehl und es wird eine Warnung für den fehlenden Initialisierer ausgegeben?
Antwort:
Gemäß dem C 20-Standard (9.3.1 Aggregate, S. 3), wenn bestimmte Initialisierer verwendet werden, muss jeder Bezeichner im Bezeichner ein direktes, nicht statisches Datenelement der Klasse benennen. Dies bedeutet, dass Basisklassenmitglieder nicht mit bestimmten Initialisierern initialisiert werden können.
Daher ist die Initialisierung von Employee mit bestimmten Initialisierern, wie im Fall von e1, falsch und sollte entweder durch eine Listeninitialisierung oder eine verschachtelte Initialisierung als ersetzt werden folgt:
<code class="cpp">Employee e1{"John", "Wick", 40, 50000}; // List initialization Employee e2{{"John", "Wick", 40}, 50000}; // Nested initialization Employee e1{{.name{"John"}, .surname{"Wick"}, .age{40}}, 50000}; // Nested initialization with designated initializer for base class</code>
Im letzten Beispiel wird die Basisklasse Person mithilfe einer festgelegten Initialisierungsliste innerhalb der verschachtelten Initialisierung initialisiert.
Das obige ist der detaillierte Inhalt vonWarum kann ich abgeleitete Klassenmitglieder nicht mit bestimmten Initialisierern in C 20 initialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!