Почему C ++ 20 не поддерживает указанный инициализатор не по порядку? - PullRequest
0 голосов
/ 11 ноября 2018

Пока я читал C ++ ссылка , у меня возник вопрос по поводу этого абзаца:

Примечание: инициализация обозначена не по порядку, обозначена как вложенная инициализация, смешивание назначенных инициализаторов и регулярных инициализаторы и назначенная инициализация массивов все поддерживается в языке программирования C, но не допускается в C ++.

Есть ли какая-либо техническая причина, которая препятствует C ++ поддерживать не назначенную инициализацию, не назначенную для заказа?

1 Ответ

0 голосов
/ 11 ноября 2018

Да, обоснование изложено в Приложении 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 ++ элементы уничтожаются в обратном порядке конструирования, а элементы списка инициализатора оцениваются в лексическом порядке, поэтому инициализаторы полей должны быть указаны в указанном порядке. Указатели массива конфликтуют с синтаксисом лямбда-выражений. Вложенные обозначения используются редко.

Первая редакция предложения также обсуждает эту тему:

Чтобы оправдать эти ожидания в отношении гарантированного разрешения копирования, мы требуем, чтобы указатели появились как подпоследовательность последовательности объявления элемента данных, так что порядок оценки соответствует порядку объявления, а также текстовой левой стороне в назначенной инициализации

Вы можете получить последнюю ревизию здесь .

...