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
Susan SarandonOriginal
2024-12-05 01:52:09203Durchsuche

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;
}

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 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.

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!

Stellungnahme:
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