Heim >Backend-Entwicklung >C++ >Warum schlägt die Vorlagenableitung mit Initialisierungslisten in C fehl?

Warum schlägt die Vorlagenableitung mit Initialisierungslisten in C fehl?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-29 16:39:09643Durchsuche

Why Does Template Deduction Fail with Initializer Lists in C  ?

Vorlagenabzugs- und Initialisierungslisten

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

Allerdings tritt beim Vergleich des Vorlagenargumentabzugs und des Schlüsselworts auto ein eigenartiges Verhalten auf. Während automatisch der Typ std::initializer_list abgeleitet wird, ist dies bei der Ableitung des Vorlagenarguments nicht der Fall. Dies liegt daran, dass der C 11-Standard ausdrücklich angibt, dass es sich um einen nicht abgeleiteten Kontext für ein Vorlagenargument handelt, wenn der Funktionsparameter eine Initialisierungsliste ist, der Parameter jedoch nicht über std::initializer_list oder einen Verweis auf einen möglicherweise cv-qualifizierten std verfügt ::initializer_list-Typ.

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!

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