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