Я понимаю, что для инициализатора в скобках 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 такая же, как и в C ++ 11, поэтому, вероятно, комитет по стандартизации не рассматривает поведение C ++ 11 как дефект.
Кто-нибудь знает, почему auto
выводит тип для инициализатора в фигурных скобках, а шаблоны не разрешены? Хотя спекулятивные объяснения формы «это могло быть причиной» интересны, меня особенно интересуют объяснения людей, которые знают, почему стандарт был написан именно так.
auto
и для шаблонов не идентичен. Если знаете, скажите, пожалуйста!. - person Andy Prowl   schedule 11.07.2013