C 11 Aggregatinitialisierung für Klassen mit nicht-statischen Elementinitialisierern
In C 11 wird eine Klasse oder Struktur als Aggregat betrachtet, wenn dies der Fall ist erfüllt bestimmte Kriterien, darunter keine benutzerdefinierten Konstruktoren, keine Initialisierer mit Klammern oder Gleichheit für nicht statische Datenelemente und keine privaten oder geschützten Elemente nicht-statische Datenelemente.
In Standard-C 11 ändert jedoch das Hinzufügen nicht-statischer Elementinitialisierer zu einer Klasse oder Struktur ihren Status als Aggregat. Dies liegt daran, dass Elementinitialisierer benutzerdefinierten Konstruktoren ähneln, was die Klasse oder Struktur davon ausschließt, ein Aggregat zu sein. Diese Definitionsänderung kann zu unerwartetem Verhalten führen.
Im bereitgestellten Beispiel:
struct A { int a = 3; int b = 3; }; A a{0,1}; // ???
Die Klasse A wird aufgrund des Vorhandenseins von klasseninternen Member-Initialisierern nicht mehr als Aggregat betrachtet. Infolgedessen ist die aggregierte Initialisierung A a{0,1}; ist ungültig.
Dieses Verhalten wurde in C 14 überarbeitet, wo das Vorhandensein nicht statischer Elementinitialisierer nicht mehr verhindert, dass eine Klasse oder Struktur ein Aggregat ist. Daher ist in C 14 die Gesamtinitialisierung von A gültig.
Es ist wichtig zu beachten, dass der C-Standard Änderungen erfahren hat und es wichtig ist, die neuesten Versionen des Standards zu überprüfen oder ein kompatibles C zu verwenden 14 oder neuerer Compiler, um eine korrekte Interpretation des Codes mit Aggregatinitialisierung und nicht-statischen Member-Initialisierern sicherzustellen.
Das obige ist der detaillierte Inhalt vonKann eine C-Klasse mit nicht statischen Elementinitialisierern ein Aggregat sein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!