Ответ 1
Обновление: Благодаря Фейсалу Вали и Ричарду Смиту эта ошибка была исправлена в Clang ToT; см. тестовый файл, введенный коммитом.
Согласно §8.5.1 [dcl.init.aggr], похоже, что Clang ошибочен:
11/Брекеты могут быть удалены в списке инициализаторов следующим образом. Если список инициализаторов начинается с левой фигурной скобки, то последующий разделенный запятыми список инициализатор-предложений инициализирует элементы субагрегата; ошибочно, чтобы было больше предложений инициализатора, чем членов. Если, однако, список инициализаторов для субагрегата не начинается с левой скобки, тогда для инициализации членов субагрегата берутся только достаточные предложения инициализатора из списка; любые оставшиеся условия инициализации оставляются для инициализации следующего члена агрегата, членом которого является текущий субагрегат. [Пример:
float y[4][3] = { { 1, 3, 5 }, { 2, 4, 6 }, { 3, 5, 7 }, };
- это полностью фиксированная инициализация: 1, 3 и 5 инициализируют первую строку массива
y[0]
, а именноy[0][0]
,y[0][1]
иy[0][2]
. Аналогично, следующие две строки инициализируютy[1]
иy[2]
. Инициализатор заканчивается раньше, и поэтому элементыy[3]
инициализируются так, как если бы они были явно инициализированы выражением формыfloat()
, то есть инициализированы с помощью0.0
. В следующем примере скобки в списке инициализаторов устранены; однако список инициализаторов имеет тот же эффект, что и полностью скопированный список инициализаторов вышеприведенного примера,float y[4][3] = { 1, 3, 5, 2, 4, 6, 3, 5, 7 };
Инициализатор для y начинается с левой скобки, но для
y[0]
нет, поэтому используются три элемента из списка. Аналогично, следующие три последовательно выполняются дляy[1]
иy[2]
. -end пример]
Я думаю, что это применимо из-за §5.3.4 [expr.new]:
15/Новое выражение, создающее объект типа T, инициализирует этот объект следующим образом:
- Если новый инициализатор опущен, объект инициализируется по умолчанию (§8.5); если инициализация не выполняется, объект имеет неопределенное значение.
- В противном случае новый-инициализатор интерпретируется в соответствии с правилами инициализации §8.5 для прямой инициализации.