Heim > Backend-Entwicklung > C++ > Hauptteil

Warum verhindert das explizite Standardisieren oder Löschen von Konstruktoren die Aggregatinitialisierung in C 20?

Patricia Arquette
Freigeben: 2024-11-02 16:28:03
Original
211 Leute haben es durchsucht

Why Does Explicitly Defaulting or Deleting Constructors Prevent Aggregate Initialization in C  20?

Warum explizite Standard- oder gelöschte Konstruktoren die Aggregatinitialisierung in C 20 verhindern

C 20 führt eine Änderung ein, die sich auf die Aggregatinitialisierung auswirkt. Zuvor konnten zulässige Strukturen explizit standardmäßige oder gelöschte Konstruktoren enthalten. Dies ist jedoch nicht mehr der Fall.

Begründung

Die Änderung wird durch den Wunsch motiviert, die Initialisierungssemantik in C zu verbessern und konsistenter zu machen. Das Zulassen der Aggregatinitialisierung mit explizit standardmäßigen oder gelöschten Konstruktoren könnte zu verwirrendem und unerwartetem Verhalten führen.

Betrachten Sie beispielsweise den folgenden Code:

<code class="cpp">struct X {
  int i{4};
  X() = default;
};

int main() {
  X x1(3); // ill-formed - no matching c’tor
  X x2{3}; // compiles!
}</code>
Nach dem Login kopieren

In C 17 würde x2 das i-Mitglied initialisieren Variable auf 3. Dieses Verhalten war jedoch mit benutzerdefinierten Konstruktoren nicht konsistent. Diese Änderung behebt diese Inkonsistenz.

Alternative Lösungen

Um den Fehler zu beheben, sollten explizit standardmäßige oder gelöschte Konstruktoren nicht für Aggregattypen verwendet werden. Erwägen Sie stattdessen, den Konstruktor wegzulassen oder einen benutzerdefinierten Konstruktor zu verwenden.

Das obige ist der detaillierte Inhalt vonWarum verhindert das explizite Standardisieren oder Löschen von Konstruktoren die Aggregatinitialisierung in C 20?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage