Ich verstehe, dass ein verspannt initializer gegeben, auto
eine Art std::initializer_list
ableiten wird, während Abzug Vorlagentyp fehl:Warum unterscheiden sich Auto- und Schablonentypabzüge für starre Initialisierer?
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
ich auch wissen, wo diese in der C++ 11-Standard spezifiziert ist: 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 ]
Was ich weiß, oder nicht verstehen Deshalb dieser Unterschied in der Art Abzug Verhalten besteht. Die Spezifikation in der C++ 14-CD ist die gleiche wie in C++ 11, daher sieht das Standardisierungsgremium vermutlich das Verhalten von C++ 11 nicht als einen Defekt an.
Weiß jemand, warum einen Typ für einen abgestützten Initialisierer ableitet, aber Vorlagen nicht erlaubt sind? Während spekulative Erklärungen der Form "das könnte der Grund sein" interessant sind, interessiere ich mich besonders für Erklärungen von Leuten, die wissen warum der Standard so geschrieben wurde, wie es war.
Es wurde kürzlich eine weitere Frage zu SO gestellt, was Sie herausgefunden haben. Es könnte einige Gründe dafür haben. – chris
Ok, habe es gefunden. Die einzige wirkliche warum Diskussion ist ein Kommentar, aber Sie können einen Blick darauf werfen: http://stackoverflow.com/questions/17496268/type-inference-with-rvalue-initializer-list – chris
Zitat aus [Scott Meyers] (http://scottmeyers.blogspot.cz/2013/07/when-decltype-meets-auto.html): "* Ich habe keine Ahnung, warum Abzüge für 'auto' eingeben und für Vorlagen nicht identisch ist. Wenn Sie wissen, bitte sagen Sie mir! * ". –