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

Warum schlägt in diesem Beispiel die Vorlagentyp-Ableitung mit „initializer_list' fehl?

Susan Sarandon
Susan SarandonOriginal
2024-11-28 18:47:11684Durchsuche

Why Does Template Type Deduction Fail with `initializer_list` in This Example?

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:

  • Die Argumente std::vector, std::string und std::array haben alle wohldefinierte Typen, die dem Parametertyp der Funktion entsprechen (z. B. std::vector).
  • Das Initialisierungslistenargument ({'a', 'b', 'c'}) hat kein ein wohldefinierter Typ. Es handelt sich um ein temporäres Objekt, das keinem bestimmten Typ zugeordnet ist.
  • 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>({'a', 'b', 'c'})).

    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 ableitet, sodass der Compiler das Vorlagenargument in printme(il) ableiten kann.

    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!

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