Будут ли поддерживаться в будущем нетривиальные обозначенные инициализаторы (Пост C ++ 17)? - PullRequest
0 голосов
/ 25 июня 2018

Это вдохновлено этим сообщением , где нетривиальные обозначенные инициализаторы не поддерживаются.

Я уже прочитал это сообщение , и в некоторых ответах утверждается, что эта функция уже поддерживается.

Однако, используя C ++ 17 и этот код:

struct s {
    int a[2];
    s (int b): a{[1]=b} {} // error
};

s foo(1);

Я все еще получаю ошибку:

извините, не реализовано: нетривиально обозначено инициализаторы не поддерживаются

s (int b): a{[1]=b} {}

Я думал, что эта функция действительно полезна.

Итак, мои вопросы:

Планируется ли поддержка этого для будущих версий C ++ (публикация C ++ 17)?

  • Если не , что является самым большим препятствием, почему оно не будет поддерживаться
  • Если да , в чем проблема с текущей версией C ++, почему для ее поддержки требуется слишком много времени

COMPILER

GNU C ++ 17 - отметьте wandbox

1 Ответ

0 голосов
/ 25 июня 2018

Предложение, принятое для добавления обозначенных инициализаторов в C ++ 20 ( p0329r0 ), ограничено преднамеренно (обратите внимание, что в качестве функции официального языка это, в частности, функция C ++ 20 - но gcc и clangпо существу уже давно поддерживали эту функцию):

enter image description here

C ++ - более сложный язык, чем C, и нам есть о чем беспокоиться,Таким образом, мы получаем следующие правила: нельзя смешивать указатели и значения, указатели появляются в порядке объявления, уникальны и не являются ни вложенными, ни индексами массивов.Это уже очень полезная языковая функция, как есть.

Если не , что является самым большим препятствием, почему он не будет поддерживаться

Мотивация, наверное.Нам действительно нужен этот синтаксис?Это проблема, которая требует решения?С другой стороны, могут быть разбор неоднозначности - вы могли бы создать инициализаторы индекса массива, которые очень похожи на лямбды.Но если вы считаете, что это достаточно полезно, вы можете написать предложение.

...