2016-09-06 3 views
20

eine Struktur mit Standardwerten initialisiert ist trivial:Brace (Aggregat) Initialisierung für structs mit Standardwerten

struct X { int a; int b = 2; }; 

und eine Struktur mit einer Klammer Initialisierer die Initialisierung ist trivial zu:

X x = {1, 3}; 

Suprisingly die Init-Code wird nicht kompiliert, bis ich den Standardwert entferne. Also, wie würde ich die Init in einem solchen Fall tun? Ich würde X gern ohne C-Tor behalten.

+4

Nur FYI: mit C++ 14, kompiliert der Code. – Mine

+1

dokumentiert hier: http://en.cppreference.com/w/cpp/language/aggregate_initialization – Hayt

+2

'Die Definition von Aggregaten wurde geändert, um jede Klasse mit Member-Initialisierer explizit auszuschließen; Daher dürfen sie die Aggregat-Initialisierung nicht verwenden. C++ 14 lockert diese Einschränkung und ermöglicht die Aggregat-Initialisierung für solche Typen. Wenn die starre Init-Liste keinen Wert für dieses Argument bereitstellt, kümmert sich der Member-Initialisierer darum, so dass Ihr Code in C++ 11 im Grunde ohne C-tor nicht möglich ist. Nur in C++ 14 –

Antwort

18

Hier einige Dokumentation relevant für das Problem:

http://en.cppreference.com/w/cpp/language/aggregate_initialization

In Code ist ungültig. In ist es wieder gültig.

In C++ 11 verhindert das Hinzufügen einer Standardinitialisierung, dass starre Init gültig ist. In C++ 14 ist dies nicht der Fall.

Eine Möglichkeit, Ihr Problem in C++ 11 zu lösen, wäre, einen Konstruktor mit dem Wert für a und dem b-Wert mit einem Standardwert zu schreiben.

+0

Hatte einige Fehlinformationen in meiner ursprünglichen Antwort. Bearbeitet es zur richtigen Lösung, aber ließ die ursprüngliche Antwort in, weil die POD-Ness auch für OP relevant – Hayt

+0

Ich editierte die ** ursprünglichen ** und ** editierten ** Teile, den Teil zusammenfügend, der in der noch gültig war Original, sobald der bearbeitete Teil dort war. Wenn jemand die Geschichte sehen möchte, kann er auf den Link Geschichte klicken. Haben meine Änderungen Ihre ursprüngliche Absicht beibehalten? Wenn nicht, können Sie gerne zurückrollen, aber ich ermutige Sie, das Bearbeitungs-/Originalmuster zu löschen. – Yakk

+0

Die Nachricht ist immer noch die gleiche. Ich fand es zu der Zeit gut (als die Nachricht keine Upvotes hatte und nicht akzeptiert wurde) dem OP anzuzeigen, dass meine erste Antwort nicht die war, nach der er suchte. Jetzt ist es akzeptiert + die einzige Antwort hier kann ich sehen, dass es besser so ist. – Hayt

Verwandte Themen