Template Type Deduction ist eine leistungsstarke Funktion von C, die es dem Compiler ermöglicht, die Typargumente einer Vorlage aus den an übergebenen Argumenten abzuleiten Vorlage. In einigen Fällen ist der Compiler jedoch nicht in der Lage, die Typargumente abzuleiten, und die Vorlage muss explizit mit den gewünschten Typargumenten instanziiert werden.
Betrachten Sie die folgende Funktion:
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; }
Dies Die Funktion erwartet einen einzelnen Parameter mit einem begin()/end()-aktivierten Typ. Die Frage ist, warum ist der folgende Code illegal?
printme({'a', 'b', 'c'});
Wenn all dies legitim ist:
printme(std::vector<char>({'a', 'b', 'c'})); printme(std::string("abc")); printme(std::array<char, 3> {'a', 'b', 'c'});
Wir können sogar Folgendes schreiben:
const auto il = {'a', 'b', 'c'}; printme(il);
Oder:
printme<std::initializer_list<char>>({'a', 'b', 'c'});
Die erste Codezeile ist illegal, da das Vorlagenargument T nicht abgeleitet werden konnte. Wenn das Vorlagenargument explizit angegeben wird, funktioniert es, z. B.:
printme<std::vector<char>>({'a', 'b', 'c'})
Oder:
printme<std::initializer_list<char>>({'a', 'b', 'c'})
Die anderen Codezeilen sind zulässig, da das Argument einen genau definierten Typ hat , sodass das Vorlagenargument T problemlos abgeleitet werden kann.
Der Teil, der möglicherweise verwirrend ist, ist, dass auto den Typ auswählt std::initializer_list
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.
Bei auto gilt jedoch § 7.1.6.4/6 explizite Unterstützung für std::initializer_list<>:
if the initializer is a braced-init-list (8.5.4), with std::initializer_list<U>.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Ableitung des Vorlagentyps mit „initializer_list' in C fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!