Имея эту структуру:Совокупные член инициализации в C++ 14
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.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 и С ++ 14 Стандарта (ISO/IEC 14882: 2014), раздел 8.5.1, пункт 7:
Если есть меньше инициализатор-положение в списке чем есть члены в совокупности, то каждый член, явно не инициализированный, должен быть инициализирован из своего логического элемента с выравниванием или равным или, если нет нулевого логического элемента, из пустого списка инициализаторов (8.5.4).
Я предполагаю, что случай 010 правильный. Тогда почему случаи 011 (a.b2.c) и 001 (a.b2.e) также не равны нулю? Случай 010 равен нулю, потому что a.b2 "имеет инициализатор", поэтому "инициализатор нестатических данных" игнорируется "(N3605). Почему инициализаторы элемента по умолчанию не игнорируются?
Фактически, прочитав стандартную цитату C++ 14, мне было бы более разумно, что случай 010 будет равен 12 (это нуль), а случаи 011 и 001 будут равны нулю (как они есть на самом деле). Поэтому я не понимаю, почему a.b2 иногда считается «иметь инициализатор», а в других случаях это не так.
«{1}' »заменяет« {11, 12, 13} ». Внутренние инициализаторы по умолчанию все еще применяются, если только список init не отменяет их (что происходит с 'b2.a', но не' b2.c' и 'b2.e'). –