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

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

auto x {7};

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

3 ответа

Решение

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

С другой стороны, способность выводить 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

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

Другие вопросы по тегам