この構造を持つ:
struct A {
struct B {
int a = 21;
int b;
int c = 22;
int d;
int e = 23;
};
B b1 = { 11, 12 };
B b2 = { 11, 12, 13 };
int x;
};
そして次のように宣言します。
A a = { { 1, 2, 3, 4 }, { 1 }, 5 };
Clang (3.8.0) と GCC (5.4.0) の両方によると、これらは 8 つの可能な組み合わせの値です (a.b1.e と a.b2.a は繰り返されるケースです)。から(またはそうでない)、:
a.b1.a = 1 // 111
a.b1.b = 2 // 110
a.b1.c = 3 // 101
a.b1.d = 4 // 100
a.b2.b = 0 // 010 // Why not 12 instead of 0? -> Explained in N3605
a.b2.c = 22 // 011 // Why not 0 instead of 22 ? Why not 13 ?
a.b2.d = 0 // 000
a.b2.e = 23 // 001 // Why not 0 instead of 23 ?
N3605および C++14 標準 (ISO/IEC 14882:2014) のセクション 8.5.1、パラグラフ 7の例を考慮に入れます。
集約内のメンバーよりもリスト内の初期化句の数が少ない場合、明示的に初期化されていない各メンバーは、brace-or-equal-initializer から初期化されるか、brace-or-equal-initializerがない場合、空のイニシャライザ リスト (8.5.4) から。
ケース010が正しいと思います。では、なぜケース 011 (a.b2.c) と 001 (a.b2.e) もゼロに等しくないのでしょうか? a.b2 には「初期化子がある」ため、ケース 010 はゼロです。したがって、「非静的データ メンバー初期化子は無視されます」( N3605再び)。デフォルトのメンバー初期化子も無視されないのはなぜですか?
実際、C++14 標準の引用を読むと、ケース 010 は 12 (ゼロ) であり、ケース 011 と 001 はゼロ (実際にはそうです) であることがより理にかなっています。だから私が理解していないのは、 a.b2 が「初期化子を持つ」と見なされる場合とそうでない場合がある理由です。