Heim >Backend-Entwicklung >C++ >Warum schlägt die Vorlagenableitung mit Initialisierungslisten in C fehl?
Betrachten Sie die folgende Funktion:
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; }
Diese Funktion akzeptiert einen einzelnen Parameter mit begin()/end () aktivierter Typ. Der folgende Codeausschnitt gilt jedoch als illegal:
printme({'a', 'b', 'c'});
Obwohl ähnlicher Code, der Vektoren, Zeichenfolgen, Arrays und explizite Initialisierungslisten verwendet, problemlos funktioniert. Es stellt sich die Frage, warum dieses spezielle Snippet illegal ist.
Der Schlüssel zum Verständnis dieses Problems liegt in der Ableitung von Vorlagenargumenten. In diesem Fall kann das Vorlagenargument T nicht abgeleitet werden. Um dies zu beheben, muss das Vorlagenargument explizit angegeben werden, wie unten gezeigt:
printme<vector<char>>({'a', 'b', 'c'}) printme<initializer_list<char>>({'a', 'b', 'c'})
In den oben genannten Snippets, in denen der Code zulässig ist, besitzt das Argument einen genau definierten Typ, der das Vorlagenargument T zulässt nahtlos abgeleitet werden. Die Verwendung von auto ermöglicht auch das Funktionieren der Funktion, da sie den Typ std::initializer_list
Allerdings tritt beim Vergleich des Vorlagenargumentabzugs und des Schlüsselworts auto ein eigenartiges Verhalten auf. Während automatisch der Typ std::initializer_list
Trotzdem unterstützt das Schlüsselwort auto speziell std::initializer_list<>, sodass der Code funktionieren kann richtig.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Vorlagenableitung mit Initialisierungslisten in C fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!