Heim >Backend-Entwicklung >C++ >Warum schlägt in diesem Beispiel die Vorlagentyp-Ableitung mit „initializer_list' fehl?
Template Type Deduction with initializer_list
Betrachten Sie die folgende Funktion:
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; }
Die obige Funktion erwartet einen einzelnen Parameter mit den Memberfunktionen begin() und end(). Es gibt verschiedene Möglichkeiten, diese Funktion mit unterschiedlichen Datentypen aufzurufen. Beispielsweise können wir einen std::vector, einen std::string, ein std::array oder sogar eine Initialisierungsliste verwenden. Es gibt jedoch einen bestimmten Fall, der illegal ist:
printme({'a', 'b', 'c'});
Diese Codezeile führt zu einem Fehler bei der Kompilierung. Warum ist das so?
Fehler beim Abzug von Vorlagenargumenten
Typabzug für Vorlagenargumente kann nur erfolgreich sein, wenn die Funktionsparametertypen mit den angegebenen Argumenttypen übereinstimmen. Im Fall der printme-Funktion:
Daher ist der Compiler nicht in der Lage, das Vorlagenargument T im Fall des Initialisierungslistenarguments abzuleiten. Durch die explizite Angabe des Vorlagenarguments wird das Problem behoben (z. B. printme
Sonderfall für auto
Während das Argument initializer list in der printme-Funktion unzulässig ist, ist es zulässig, auto zum Initialisieren einer Variablen zu verwenden das eine Initialisierungsliste enthält. Dies liegt daran, dass auto den Typ von il als std::initializer_list
Das obige ist der detaillierte Inhalt vonWarum schlägt in diesem Beispiel die Vorlagentyp-Ableitung mit „initializer_list' fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!