Dlaczego odliczanie typów automatycznych i szablonowych różni się w przypadku inicjalizatorów wzmocnionych?

Rozumiem to, biorąc pod uwagę wzmocniony inicjator,auto wydedukuje rodzajstd::initializer_list, podczas gdy odliczanie typu szablonu nie powiedzie się:

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

Wiem nawet, gdzie jest to określone w standardzie C ++ 11: 14.8.2.5/5 punktor 5:

[Jest to kontekst nie dedukcyjny, jeśli program ma] Parametr funkcji, dla którego powiązany argument jest listą inicjalizatora (8.5.4), ale parametr nie ma std :: initializer_list lub odwołania do ewentualnie cv-kwalifikowanego std :: initializer_list rodzaj. [Przykład:

szablon void g (T);

g ({1,2,3}); // błąd: brak argumentu wywnioskowanego dla T

—przykład końcowy ]

Nie wiem lub nie rozumiemczemu ta różnica w zachowaniu odliczenia typu istnieje. Specyfikacja w CD C ++ 14 jest taka sama jak w C ++ 11, więc prawdopodobnie komitet standaryzacyjny nie uważa zachowania C ++ 11 za wadę.

Czy ktoś wie dlaczegoauto wywnioskuje typ dla wzmocnionego inicjatora, ale szablony nie są dozwolone? Chociaż spekulacyjne wyjaśnienia formy „to może być powód” są interesujące, szczególnie interesują mnie wyjaśnienia od ludzi, którzywiedzieć dlaczego standard został napisany tak, jak był.

questionAnswers(3)

yourAnswerToTheQuestion