Heim > Artikel > Backend-Entwicklung > Warum schlägt die Aggregatinitialisierung mit explizit standardmäßigen oder gelöschten Konstruktoren in C 20 fehl?
Warum die Aggregatinitialisierung mit explizit standardmäßigen oder gelöschten Konstruktoren in C 20 fehlschlägt
In C 20 schlägt die Aggregatinitialisierung von Strukturen mit explizit standardmäßigen oder gelöschten Konstruktoren fehl Konstruktoren werden nicht mehr unterstützt. Diese Änderung ist das Ergebnis einer Überarbeitung des C-Standards. Vor C 20 war die Aggregatinitialisierung für Strukturen zulässig, die entweder keine Konstruktoren oder nur explizit standardmäßige oder gelöschte Konstruktoren hatten. In C 20 wurde der Standard jedoch dahingehend aktualisiert, dass die Aggregatinitialisierung nur für Strukturen ohne vom Benutzer deklarierte oder geerbte Konstruktoren zulässig ist.
Begründung hinter der Änderung
Die Änderung wurde eingeführt, um das Problem des unerwarteten und verwirrenden Initialisierungsverhaltens zu beheben. In früheren Versionen von C konnten explizit standardmäßig festgelegte oder gelöschte Konstruktoren eine Aggregatinitialisierung ermöglichen, auch wenn dies nicht beabsichtigt war. Dies könnte zu unerwarteten Konvertierungen und Fehlern führen. Durch die Eliminierung der Aggregatinitialisierung in diesen Fällen stellt der Standard sicher, dass die Initialisierung immer über den/die Konstruktor(en) erfolgt, was zu einem konsistenten und vorhersehbaren Verhalten führt.
Beispiel
Vor C 20 wäre der folgende Code ohne Fehler kompiliert worden:
<code class="cpp">struct Foo { Foo() = default; int bar; }; auto test = Foo { 0 }; // Aggregate initialization</code>
In C 20 löst derselbe Code jedoch einen Compilerfehler aus, da der Konstruktor explizit auf die Standardeinstellung gesetzt ist und eine Aggregatinitialisierung nicht mehr zulässig ist. Um das Problem zu beheben, kann der explizit standardmäßige Konstruktor entfernt werden oder die Initialisierung kann explizit mithilfe des Konstruktors erfolgen:
<code class="cpp">auto test = Foo(0); // Constructor initialization</code>
Auswirkungen auf Codierungspraktiken
Während explizit Das Standardisieren oder Löschen von Konstruktoren galt früher als bewährte Vorgehensweise. Die Änderung im C 20-Standard legt nahe, dass dies nicht mehr vorteilhaft ist. In C 20 und späteren Versionen wird empfohlen, sich auf das implizite Standardverhalten von Konstruktoren zu verlassen und das explizite Standardisieren oder Löschen von Konstruktoren zu vermeiden, es sei denn, es gibt einen bestimmten Grund dafür.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Aggregatinitialisierung mit explizit standardmäßigen oder gelöschten Konstruktoren in C 20 fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!