Partielle Aggregatinitialisierung und nicht statische Datenelementinitialisierung

8
%Vor%

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.

    
yngccc 04.06.2014, 17:12
quelle

2 Antworten

13

C ++ 98, C ++ 03

Initiatoren für nicht statische Datenmember (NSDMIs) existieren nicht; Die Frage ist unanwendbar.

C ++ 11

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.

C ++ 1y

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:

  

[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:

%Vor%      

initialisiert ss.a mit 1 , ss.b mit "asdf" , ss.c mit dem Wert eines Ausdrucks der Form int{} (also 0 ) und ss.d mit dem Wert von ss.b[ss.a] (also ’s’ ) und in

%Vor%      

a und b haben den gleichen Wert -end-Beispiel]

    
Lightness Races in Orbit 04.06.2014, 17:23
quelle
3

(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.

    
Vlad from Moscow 04.06.2014 17:27
quelle

Tags und Links