Почему автоматическое вычитание и вычитание типов шаблонов различаются для инициализаторов в фигурных скобках?

Я понимаю, что, учитывая инициализированный скобками,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

Я даже знаю, где это указано в стандарте C ++ 11: 14.8.2.5/5 bullet 5:

[Это не выводимый контекст, если программа имеет] Параметр функции, для которого связанный аргумент является списком инициализатора (8.5.4), но у этого параметра нет std :: initializer_list или ссылки на возможно cv-квалифицированный std :: initializer_list тип. [Пример:

шаблон пустоты g (T);

г ({1,2,3}); // ошибка: аргумент не выводится для T

—конец примера ]

То, что я не знаю или не понимаю,Почему эта разница в типе поведения вывода существует. Спецификация на C ++ 14 CD такая же, как и в C ++ 11, поэтому предположительно комитет по стандартизации не рассматривает поведение C ++ 11 как дефект.

Кто-нибудь знает почемуauto выводит тип для фигурного инициализатора, но шаблоны не разрешены? Хотя спекулятивные объяснения формы «это может быть причиной» интересны, меня особенно интересуют объяснения людей, которыезнать почему стандарт был написан именно так.

Ответы на вопрос(3)

Ваш ответ на вопрос