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

Я понимаю, что, учитывая инициализированный скобками,auto выведет типstd::initializer_list, в то время как вывод типа шаблона не удастся:

auto var = { 1, 2, 3 };   // type deduced as std::initializer_list

template 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)

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