Struktur mit {0} initialisieren

8

Ich debugge einen Code, der im Wesentlichen mit diesem identisch ist:

struct Foo { int a; int b; };
struct Bar { Bar() {} Foo foo{0}; };

Wenn ich eine Instanz von mache Bar, scheint es wie beides aund bwird auf Null initialisiert. Ist das garantiert? Wo finde ich das in der Spezifikation?

XPlatformer
quelle
Versuchen Sie: struct Foo { int a{}; int b{}; };Beachten Sie die zusätzlichen Klammern nach den Variablennamen. dann erhalten Sie immer initialisierte Werte. Wenn Sie mit anderen Werten und mit definiertem Verhalten beginnen müssen, müssen Sie einen Ctor wie für jede andere Klasse schreiben
skratchi.at
@ skratchi.at Das sind keine Klammern (die Verwendung von Klammern würde etwas anderes bedeuten)
Leichtigkeitsrennen im Orbit
1
Eine so einfache Frage an der Oberfläche, aber C ++ init ist so kompliziert, dass ich verstehe, warum Sie sie stellen. Ich könnte eine Vermutung wagen, dass Sie hier die richtige Aggregat-Init erhalten, aber ohne auf den Standard einzugehen, bin ich mir nicht sicher, wie die Antwort lautet. Wie traurig ist das?
Leichtigkeitsrennen im Orbit
Dies ist für Arrays, aber ... stackoverflow.com/questions/1065774/…
YSC
Eine andere ähnliche Frage: stackoverflow.com/questions/1069621/…
Frodyne

Antworten:

3

Laut cppreference.com

Wenn die Anzahl der Initialisierungsklauseln geringer ist als die Anzahl der Mitglieder [und Basen (seit C ++ 17)] oder die Initialisierungsliste vollständig leer ist, werden die verbleibenden Mitglieder [und Basen (seit C ++ 17)] [durch ihre initialisiert Standardelementinitialisierer, sofern in der Klassendefinition angegeben, und ansonsten (seit C ++ 14)] durch leere Listen gemäß den üblichen Regeln für die Listeninitialisierung (die eine Wertinitialisierung für Nichtklassentypen und Nichtaggregatklassen durchführt mit Standardkonstruktoren und Aggregatinitialisierung für Aggregate). Wenn ein Mitglied eines Referenztyps eines dieser verbleibenden Mitglieder ist, ist das Programm fehlerhaft.

Foohat keine Standard-Member-Initialisierer ( int b{0};) und bwird daher durch Listeninitialisierung mit einer leeren Liste initialisiert. Dies bedeutet Wertinitialisierung für Nicht-Klassentypen : b = int() // = 0.

eike
quelle