Rozumiem, że, biorąc pod uwagę usztywnione inicjator, auto
będzie wydedukować rodzaj std::initializer_list
, natomiast typ szablonu odliczenie zawiedzie:Dlaczego odliczanie typu auto i szablon różnią się w przypadku inicjatorów ze stężeniem?
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
ja nawet wiem, gdzie to jest określone w standardzie C++ 11: 14.8. 2,5/5 punkt 5:
[It's a non-deduced context if the program has] A function parameter for which the associated argument is an initializer list (8.5.4) but the parameter does not have std::initializer_list or reference to possibly cv-qualified std::initializer_list type. [ Example:
template void g(T);
g({1,2,3}); // error: no argument deduced for T
—end example ]
Co nie wiem, czy rozumiem dlaczego ta różnica w zachowaniu typu odliczenia istnieje. Specyfikacja na CD C++ 14 jest taka sama jak w C++ 11, więc przypuszczalnie komitet normalizacyjny nie postrzega zachowania C++ 11 jako defektu.
Czy ktoś wie, dlaczego auto
wnioskuje o typ zbędnego inicjatora, ale szablony nie są dozwolone? Podczas gdy spekulatywne wyjaśnienia dotyczące formy "może to być powodem" są interesujące, szczególnie interesują mnie wyjaśnienia osób, dla których standard został napisany tak, jak był.
Było jeszcze jedno pytanie zadane przez SO na temat tego, co wymyśliłeś. Może mieć w tym jakiś powód. – chris
Ok, znalazłem. Jedynym powodem, dla którego dyskusja jest jednym komentarzem, możesz rzucić okiem: http://stackoverflow.com/questions/17496268/type-inference-with-rvalue-initializer-list – chris
Cytat z [Scott Meyers] (http: // /scottmeyers.blogspot.cz/2013/07/when-decltype-meets-auto.html): "* Nie mam pojęcia, dlaczego dedukcja typu dla' auto' i dla szablonów nie jest identyczna. Jeśli wiesz, proszę powiedz mi! * ". –