Heim > Backend-Entwicklung > C++ > Warum ist „printme({\'a\', \'b\', \'c\'});' bei der C-Vorlagentyp-Ableitung illegal?

Warum ist „printme({\'a\', \'b\', \'c\'});' bei der C-Vorlagentyp-Ableitung illegal?

Patricia Arquette
Freigeben: 2024-12-02 20:24:14
Original
416 Leute haben es durchsucht

Why is `printme({'a', 'b', 'c'});` Illegal in C   Template Type Deduction?

Typabzug in Funktionen mit Initialisierungslisten

Bedenken Sie die Funktionsvorlage:

template<typename T>
void printme(T&& t) {
  for (auto i : t)
    std::cout << i;
}
Nach dem Login kopieren

Diese Funktion erwartet einen Parameter eines Typs mit einem Anfang () und end() Funktion.

Frage:

Warum ist der folgende Aufruf illegal?

printme({'a', 'b', 'c'});
Nach dem Login kopieren

Antwort:

Der Aufruf printme({'a', 'b', 'c'}) ist illegal, da das Vorlagenargument T nicht abgeleitet werden kann. Ohne explizite Angabe des Vorlagenarguments kann der Compiler den Typ des Parameters nicht bestimmen, da es sich um einen beliebigen Typ mit einer begin()- und end()-Funktion handeln kann. Dieses Problem tritt in den folgenden Fällen nicht auf:

  • Explizite Vorlagenargumentspezifikation: printme>({'a', 'b', 'c'})
  • Parametertypen mit Typabzug: printme(std::vector({'a', 'b', 'c'}))
  • Verwenden von auto, um den Typ abzuleiten: const auto il = {'a', 'b', 'c'}; printme(il);
  • Explizite Angabe des Vorlagenarguments: printme>({'a', 'b', 'c'})
  • Die Ausnahme hiervon ist die Ableitung von auto als std::initializer_list, die sich vom Template-Argument unterscheidet Abzug. Dieses Verhalten ist explizit im C 11-Standard (§ 14.8.2.5/5) spezifiziert, der besagt, dass das Vorlagenargument für einen Funktionsparameter, der eine Initialisierungsliste, aber nicht vom Typ std::initializer_list ist, nicht abgeleitet wird. Allerdings bietet § 7.1.6.4/6 des Standards explizite Unterstützung für auto, um std::initializer_list<>.

    abzuleiten

    Das obige ist der detaillierte Inhalt vonWarum ist „printme({\'a\', \'b\', \'c\'});' bei der C-Vorlagentyp-Ableitung illegal?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage