Почему c ++ 11 не разрешает прямую инициализацию списка с помощью auto - PullRequest
1 голос
/ 06 февраля 2020

Мой друг сказал мне, что

auto x1 = {3}; // x1 is std::initializer_list<int>
auto x2{1, 2}; // error: not a single element
auto x3{3};    // x3 is int

Я не совсем понимаю, почему auto x2{1, 2}; незаконно, не может ли оно быть выведено непосредственно как std::initializer_list<int>?

Ответы [ 2 ]

3 голосов
/ 06 февраля 2020

Стандарт намеренно ограничил этот случай.

auto x2{1, 2}; // error: not a single element

Автоматические и фигурные инициализаторы вызывают проблемы с обучаемостью; мы хотим научить людей использовать унифицированную инициализацию, но мы должны специально указать программистам, чтобы они не использовали скобки с помощью auto. В C ++ 14 у нас теперь больше случаев, когда auto и фигурные скобки являются проблематичными; Вывод возвращаемого типа для функций частично устраняет проблему, так как возвращение фигурного списка не будет работать, так как это не выражение. Однако возвращение автоматической переменной, инициализированной из инициализатора с фигурными скобками, все еще возвращает initializer_list, вызывая неопределенное поведение. У захвата лямбда-инициатора та же проблема. В этой статье предлагается изменить инициализированный скобками auto, чтобы он не выводился в список инициализаторов, и запретить инициализированный скобками auto для случаев, когда braced-initializer имеет более одного элемента.

Более подробную информацию см. В документе Комитета по стандартам ISO / IEC JTC1 / SC22 / WG21 C ++ по Автоматические и фигурные списки инициализации .

0 голосов
/ 06 февраля 2020

Это, согласно моему компилятору, потому что x2 является скаляром и поэтому может иметь только один индекс. Однако следующее компилируется, потому что это массив, а массивы имеют два индекса:

auto x2 [] {1,2};

...