Heim  >  Artikel  >  Backend-Entwicklung  >  Warum schlägt die Aggregatinitialisierung mit explizit standardmäßigen oder gelöschten Konstruktoren in C 20 fehl?

Warum schlägt die Aggregatinitialisierung mit explizit standardmäßigen oder gelöschten Konstruktoren in C 20 fehl?

DDD
DDDOriginal
2024-11-02 18:24:30181Durchsuche

Why Does Aggregate Initialization Fail with Explicitly Defaulted or Deleted Constructors in C  20?

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!

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