Heim > Backend-Entwicklung > C++ > Warum ist die Aggregatinitialisierung für Strukturen mit explizit standardmäßigen oder gelöschten Konstruktoren in C 20 nicht mehr zulässig?

Warum ist die Aggregatinitialisierung für Strukturen mit explizit standardmäßigen oder gelöschten Konstruktoren in C 20 nicht mehr zulässig?

Patricia Arquette
Freigeben: 2024-11-03 08:29:30
Original
702 Leute haben es durchsucht

Why Is Aggregate Initialization No Longer Allowed for Structs with Explicitly Defaulted or Deleted Constructors in C  20?

Aggregatinitialisierung in C 20

In C 20 hat die Aggregatinitialisierung für Strukturen, die explizit standardmäßige oder gelöschte Konstruktoren haben, eine wesentliche Änderung erfahren. Diese Änderung betrifft Code, der zuvor gültig war, jetzt aber Fehler generiert.

Kompatibilität vor C 20

Vor C 20 war die aggregierte Initialisierung für Strukturen zulässig, die benutzerdefiniert waren. bereitgestellte, geerbte oder explizit standardmäßige oder gelöschte Konstruktoren. Dies ermöglichte die Umgehung von Konstruktoren während der Initialisierung.

C 20-Standards

Der C 20-Standard hat dieses Verhalten jedoch überarbeitet. Die Aggregatinitialisierung ist jetzt nur für Strukturen zulässig, denen vom Benutzer deklarierte oder geerbte Konstruktoren fehlen. Explizit voreingestellte oder gelöschte Konstruktoren sind nicht mehr zulässig. Diese Änderung wurde implementiert, um Mehrdeutigkeit und Verwirrung in der Initialisierungssemantik zu beseitigen.

Begründung für die Änderung

Der Grund für diese Änderung der C-Standards liegt im Wunsch nach Verbesserung die Sicherheit, Einheitlichkeit und Klarheit der Initialisierung. Das vorherige Verhalten könnte zu unerwartetem und fehlerhaftem Code führen, wie dargestellt durch:

struct X {
  int i{4};
  X() = default;
};

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

In diesem Beispiel kann der Standardkonstruktor von X aufgrund der Deklaration der Mitgliedsvariablen i mit einem Anfangsbuchstaben nicht zur Initialisierung verwendet werden Wert von 4. Die aggregierte Initialisierung ist jedoch fälschlicherweise zulässig, was zu mehrdeutigem und möglicherweise falschem Verhalten führt.

Auswirkungen auf den Code

Diese Änderung erfordert Codeänderungen für Fälle, in denen aggregiert wird Die Initialisierung wurde zuvor mit explizit standardmäßigen oder gelöschten Konstruktoren verwendet. Dies fordert Entwickler dazu auf, die Praxis der expliziten Standardeinstellung von Konstruktoren für aggregierte Datentypen zu überdenken.

Zusammenfassend lässt sich sagen, dass die Änderung des C 20-Standards bezüglich der aggregierten Initialisierung darauf abzielt, die Zuverlässigkeit und Konsistenz von Initialisierungsidiomen zu verbessern und die potenzielle Abwärtsinkompatibilität zu rechtfertigen es stellt vor.

Das obige ist der detaillierte Inhalt vonWarum ist die Aggregatinitialisierung für Strukturen mit explizit standardmäßigen oder gelöschten Konstruktoren in C 20 nicht mehr zulässig?. 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