{0}で構造体を初期化しています


8

私は本質的にこれと同じであるいくつかのコードをデバッグしています:

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

私はのインスタンスを作成するときBar、それは両方のように思えるaし、bゼロに初期化されています。これは保証されていますか?これは仕様のどこにありますか?


試してください:struct Foo { int a{}; int b{}; };変数名の後の余分な中括弧に注意してください。その後、常に初期化された値を取得します。定義済みの動作で他の値で初期化する必要がある場合は、他のすべてのクラスのように
ctor

@ skratchi.atこれらはかっこではありません(かっこを使用すると別の意味になります)
オービットの

1
表面的にはこのような単純な質問ですが、C ++ initは非常に複雑なので、なぜあなたがそれを求めているのか理解できます。ここで適切な集約初期化行われているという推測を危険にさらす可能性がありますが、標準を掘り下げることなく、答えが何であるかわかりません。悲しいですか?
オービットのライトネスレース

これは配列のためですが、... stackoverflow.com/questions/1065774/...
YSC

回答:


3

cppreference.comによると

初期化句の数がメンバーの数より少ない場合(およびベース(C ++ 17以降))または初期化リストが完全に空の場合、残りのメンバー[およびベース(C ++ 17以降)]は、クラス定義で提供されている場合はデフォルトのメンバー初期化子、それ以外の場合(C ++ 14以降)]通常のリスト初期化規則(非クラス型と非集約クラスの値の初期化を実行する)に従って空のリストでデフォルトのコンストラクタ、および集計の集計初期化を使用)。参照型のメンバーがこれらの残りのメンバーの1つである場合、プログラムの形式は正しくありません。

Fooにはデフォルトのメンバー初期化子(int b{0};)がないためb、空のリストを使用したlist-initializationによって初期化されます。これは、非クラス型の値の初期化を意味しますb = int() // = 0

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.