Heim > Backend-Entwicklung > C++ > Warum schlägt die Ableitung des Vorlagentyps mit „initializer_list' in C fehl?

Warum schlägt die Ableitung des Vorlagentyps mit „initializer_list' in C fehl?

Susan Sarandon
Freigeben: 2024-12-05 01:52:09
Original
193 Leute haben es durchsucht

Why Does Template Type Deduction Fail with `initializer_list` in C  ?

initializer_list und Template Type Deduction

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;
}
Nach dem Login kopieren

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'});
Nach dem Login kopieren

Wenn all dies legitim ist:

printme(std::vector<char>({'a', 'b', 'c'}));
printme(std::string("abc"));
printme(std::array<char, 3> {'a', 'b', 'c'});
Nach dem Login kopieren

Wir können sogar Folgendes schreiben:

const auto il = {'a', 'b', 'c'};
printme(il);
Nach dem Login kopieren

Oder:

printme<std::initializer_list<char>>({'a', 'b', 'c'});
Nach dem Login kopieren

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'})
Nach dem Login kopieren

Oder:

printme<std::initializer_list<char>>({'a', 'b', 'c'})
Nach dem Login kopieren

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 das Template-Argument jedoch nicht. Dies liegt daran, dass § 14.8.2.5/5 des C 11-Standards ausdrücklich besagt, dass es sich um einen nicht abgeleiteten Kontext für ein Vorlagenargument handelt:

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.
Nach dem Login kopieren

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>.
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage