Я понимаю, что, учитывая строгий инициализатор, auto
выведет тип std::initializer_list
, в то время как вывод типа шаблона не будет выполнен:
auto var = { 1, 2, 3 }; // type deduced as std::initializer_list<int>
template<class T> void f(T parameter);
f({ 1, 2, 3 }); // doesn't compile; type deduction fails
Я даже знаю, где это указано в стандарте С++ 11:14.8.2.5/5 bullet 5:
[Это не выводимый контекст, если программа имеет] Параметр функции, для которого связанный аргумент является списком инициализаторов (8.5.4), но параметр не имеет std:: initializer_list или ссылки на возможно cv-qualified std:: initializer_list тип. [Пример:
шаблон void g (T);
г ({1,2,3});//ошибка: не выводится аргумент для T
-end пример]
То, что я не знаю или не понимаю, почему это отличие в поведении типа дедукции существует. Спецификация на компакт-диске С++ 14 такая же, как в С++ 11, поэтому, по-видимому, комитет по стандартизации не рассматривает поведение С++ 11 как дефект.
Кто-нибудь знает, почему auto
выводит тип для упрощенного инициализатора, но шаблонам не разрешено? Хотя спекулятивные объяснения формы "это может быть причиной" интересны, меня особенно интересуют объяснения от людей, которые знают, почему стандарт был написан так, как он был.