Зачем им специальные списки инициализаторов, а не обрабатывать их одинаково?
Скажи у меня есть переменная 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
Переменная всегда становится списком инициализации, а не пытается выводить другой тип в определенных особых случаях, таких как этот.