Имея такую структуру:
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:
Если в списке меньше предложений-инициализаторов, чем элементов в совокупности, то каждый элемент, не инициализированный явно, должен быть инициализирован из его объединяющего-или-равного-инициализатора. или, если нет обозначения-или-равно-инициализатора, из пустого списка инициализаторов (8.5.4).
Я предполагаю, что случай 010 правильный. Тогда почему случаи 011 (a.b2.c) и 001 (a.b2.e) тоже не равны нулю? Случай 010 равен нулю, потому что a.b2 «имеет инициализатор», поэтому «инициализатор нестатического члена данных игнорируется» (N3605 еще раз). Почему инициализаторы элементов по умолчанию также не игнорируются?
На самом деле, читая стандартную цитату С++ 14, я понял, что случай 010 будет равен 12 (это ноль), а случаи 011 и 001 будут равны нулю (как они есть на самом деле). Так что я не понимаю, почему a.b2 иногда считается "имеющим инициализатор", а иногда - нет.
{ 1 }
заменяет{ 11, 12, 13 }
. Внутренние инициализаторы по умолчанию по-прежнему применяются, если их не переопределяет список инициализации (что происходит сb2.a
, но не сb2.c
иb2.e
). - person Baum mit Augen   schedule 10.01.2017