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! }
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!