Да, обоснование изложено в Приложении C (информативно).
Совместимость , в частности [diff.dcl] p10 ( упорная мина ):
Затрагиваемый подпункт: [dcl.init.aggr] Изменение: в C ++ обозначено
поддержка инициализации ограничена по сравнению с соответствующей
функциональность в C. В C ++ обозначения для нестатических членов данных
должен быть указан в порядке объявления , обозначения для элементов массива
и вложенные указатели не поддерживаются, а обозначенные и
неназначенные инициализаторы нельзя смешивать в одном и том же инициализаторе
список. Пример:
struct A { int x, y; };
struct B { struct A a; };
struct A a = {.y = 1, .x = 2}; // valid C, invalid C++
int arr[3] = {[1] = 5}; // valid C, invalid C++
struct B b = {.a.x = 0}; // valid C, invalid C++
struct A c = {.x = 1, 2}; // valid C, invalid C++
Обоснование: В C ++ элементы уничтожаются в обратном порядке конструирования, а элементы списка инициализатора оцениваются в лексическом порядке, поэтому инициализаторы полей должны быть указаны в указанном порядке.
Указатели массива конфликтуют с синтаксисом лямбда-выражений.
Вложенные обозначения используются редко.
Первая редакция предложения также обсуждает эту тему:
Чтобы оправдать эти ожидания в отношении гарантированного разрешения копирования, мы требуем, чтобы указатели появились
как подпоследовательность последовательности объявления элемента данных, так что порядок оценки
соответствует порядку объявления, а также текстовой левой стороне в назначенной инициализации
Вы можете получить последнюю ревизию здесь .