Скажи у меня есть переменная auto x
что я хочу инициализировать в 7
используя инициализацию скобок, просто:
auto x {7};
За исключением того, что я узнал, что х НЕ целое число, но сам список инициализации. Зачем? Есть ли конкретная причина, почему комитет решил, что auto
следует взять список инициализации в случае единственного автоматического значения или они ожидают, что мы просто поймем, что их не следует использовать вместе. Я не могу думать о возможной причине, я хотел бы, чтобы список инициализатора был сохранен в auto в противоположность значению
Очень практичный ответ: «Почему 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
переменная всегда становится списком инициализации, а не пытается выводить другой тип в определенных особых случаях, таких как этот.