C 11 Aggregatinitialisierung für Klassen mit Member-Initialisierern
C 11 führt die Aggregatinitialisierung mit geschweiften Klammern für Klassen ein und ermöglicht die Angabe von Initialisierern für alle nicht statischen Datenelemente. Der Standard in C 11 wirft jedoch die Frage auf: Können klasseninterne Mitgliedsinitialisierer in Aggregatstrukturen vorhanden sein?
In C 11 führt das Vorhandensein von Mitgliedsinitialisierern in einer Klasse dazu, dass die Struktur oder Klasse nicht aggregiert ist. Diese Einschränkung ergab sich aus der Annahme, dass klasseninterne Member-Initialisierer Ähnlichkeiten mit benutzerdefinierten Konstruktoren aufweisen. Allerdings sollte das Hinzufügen von Mitgliedsinitialisierern eine Klasse nicht automatisch von der Eigenschaft als Aggregat ausschließen.
Der C 14-Standard behebt dieses Problem, indem er die Definition von Aggregatklassen so ändert, dass nur vom Benutzer bereitgestellte Konstruktoren, privat oder geschützt, nicht statisch, ausgeschlossen werden Datenelemente, Basisklassen und virtuelle Funktionen. Die Einbeziehung von Mitgliedsinitialisierern als Disqualifizierer wurde entfernt.
Daher wird in C 14 eine Klasse wie die folgende jetzt als Aggregat betrachtet:
struct A { int a = 3; int b = 3; }; A a{0, 1};
In C 11 das Obige Code wäre ungültig gewesen, da A kein Aggregat ist. In C 14 ist der Code jedoch gültig und das Objekt a wird mit a = 0 und b = 1 initialisiert.
Neueste Versionen von g (5.0 und höher) unterstützen jetzt die Definition von Aggregaten mit in C 14 nicht statische Member-Initialisierer. Daher wird der Beispielcode in g entweder mit -std=c 14 oder -std=c 1y kompiliert.
Das obige ist der detaillierte Inhalt vonKönnen Klassen mit Member-Initialisierern Aggregate in C 14 sein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!