Gemäß dem Standard werden fehlende Elemente in der Initialisiererliste initialisiert, also sollte y
int()
oder 0
sein, aber es scheint nicht zu sagen, was in der Situation des Nicht-statischen Datenelement-Initialisierers passiert .
Edit: Nach der Antwort, anscheinend ist das ungültig c ++ 11, würde ich gerne die Situation in C ++ 1y wissen.
Initiatoren für nicht statische Datenmember (NSDMIs) existieren nicht; Die Frage ist unanwendbar.
Zunächst ist diese Initialisierung ungültig, weil Ihr Typ kein Aggregat ist:
[C++11: 8.5.1/1]:
Ein Aggregat ist ein Array oder eine Klasse (Klausel 9) mit vom Benutzer bereitgestellten Konstruktoren (12.1), no brace-or-equal-initializers für nicht statische Datenelemente (9.2), keine privaten oder geschützten nicht statischen Datenelemente (Abschnitt 11), keine Basisklassen (Abschnitt 10) und keine virtuellen Funktionen (10.3).
Daher kann die Aggregat-Initialisierung hier nicht durchgeführt werden; Ein Konstruktor, der ein std::initializer_list
verwendet, wäre die einzige Möglichkeit, diese Initialisierungssyntax ( [C++11: 8.5.4/3]
) zu verwenden, aber Sie haben auch keine.
Folglich ist die gesamte Prämisse der Frage fehlerhaft: Es ist nicht möglich, sich in diesen Zustand zu versetzen.
In der kommenden Version des Standards wurde die Definition von Aggregaten gelockert, damit Ihr Typ als Aggregat angesehen werden kann (solange beide dieser Mitglieder public
bleiben!):
[n3936: 8.5.1/1]
Ein Aggregat ist ein Array oder eine Klasse (Klausel 9) ohne von Benutzern bereitgestellte Konstruktoren (12.1), keine private oder geschützte nicht -static Datenelemente (Abschnitt 11), keine Basisklassen (Abschnitt 10) und keine virtuellen Funktionen (10.3).
Im Anschluss daran gibt es eine Regel, die das gesuchte Ergebnis garantiert:
%Vor%
[n3936: 8.5.1/7]
: Wenn es weniger Initialisierungsklauseln in der Liste gibt, als es Mitglieder im Aggregat gibt, dann sollte jedes nicht explizit initialisierte Element von seinem brace-or- Equal-Initializer oder, wenn kein brace-or-equal-initializer vorhanden ist, aus einer leeren Initialisierungsliste (8.5.4). [Beispiel:initialisiert
%Vor%ss.a
mit1
,ss.b
mit"asdf"
,ss.c
mit dem Wert eines Ausdrucks der Formint{}
(also0
) undss.d
mit dem Wert vonss.b[ss.a]
(also’s’
) und in
a
undb
haben den gleichen Wert -end-Beispiel]
(Antwort gültig in C ++ 1y, nur !)
Gemäß Absatz # 7 im Abschnitt "8.5.1 Aggregate" (Arbeitsentwurf N3691 Datum: 2013-05-16)
7 Wenn in der Liste weniger Initialisierungsklauseln vorhanden sind als vorhanden Mitglieder im Aggregat, dann wird jedes Mitglied nicht explizit initialisiert soll initialisiert werden von seiner Klammer-oder-Gleich-Initialisierer oder, wenn dort ist kein Klammer-oder-Gleich-Initializer aus einer leeren Initialisierungsliste (8.5.4).
Und unter dem Zitat gibt es ein Beispiel
%Vor%Also wird in Ihrem Beispiel p.y mit 10 initialisiert.