Зачем им специальные списки инициализаторов, а не обрабатывать их одинаково?

Скажи у меня есть переменная auto x что я хочу инициализировать в 7 используя инициализацию скобок, просто:

auto x {7};

За исключением того, что я узнал, что х НЕ целое число, но сам список инициализации. Зачем? Есть ли конкретная причина, почему комитет решил, что auto следует взять список инициализации в случае единственного автоматического значения или они ожидают, что мы просто поймем, что их не следует использовать вместе. Я не могу думать о возможной причине, я хотел бы, чтобы список инициализатора был сохранен в auto в противоположность значению

3

Решение

Очень практичный ответ: «Почему int быть выбранным? «Или doubleили любой UDT с конструктором с одним аргументом int? Отклоняя вывод конкретного типа, компилятор сохраняет любое возможное применение более общего списка инициализаторов.

3

Другие решения

С другой стороны, способность выводить initializer_list<X> за T привлекательно разрешить:

auto x = { 1, 1, 2, 3, 5 };
f(x);
g(x);

что было сочтено желательным поведением с самого начала дискуссий РГЭ о списках инициализаторов.

Вместо того, чтобы придумать умное правило удержания для типа параметра T в сочетании с {} -списком (опция, которую мы использовали в более ранних набросках и черновиках этой статьи), теперь мы предпочитаем обрабатывать это с особым случаем для «автоматического» вывода переменной, когда инициализатор является {} -списком. То есть, для конкретного случая переменной, объявленной со спецификатором типа «auto» и инициализатором {} -list, «auto» выводится как для функции f(initializer_list<T>) а не как для function f(T),

См. Главу «Вывод аргумента шаблона» в этом PDF. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2640.pdf

Для после C ++ 14 есть статья, в которой предлагается изменить эти правила, чтобы в случае с одним элементом тип выводился из типа инициализатора. Предполагается, что случай с нулем и множеством элементов будет плохо сформирован. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3681.html

3

Я предполагаю, что причина в том, что так auto всегда взаимодействует со списками инициализации одинаково. Другими словами, auto переменная всегда становится списком инициализации, а не пытается выводить другой тип в определенных особых случаях, таких как этот.

1
По вопросам рекламы [email protected]