Heim > Backend-Entwicklung > C++ > Warum kann ich einen Vorlagenkonstruktor in einer C-Initialisierungsliste nicht explizit aufrufen?

Warum kann ich einen Vorlagenkonstruktor in einer C-Initialisierungsliste nicht explizit aufrufen?

Susan Sarandon
Freigeben: 2024-12-18 03:56:09
Original
460 Leute haben es durchsucht

Why Can't I Explicitly Invoke a Template Constructor in a C   Initializer List?

Expliziter Vorlagenkonstruktoraufruf in C

In C ist es nicht möglich, einen Vorlagenkonstruktor explizit in einer Initialisierungsliste aufzurufen. Dies liegt an der spezifischen Syntax, die für Vorlagenargumente verwendet wird, die dem Namen der Funktionsvorlage folgen und nicht während der Konstruktion in Klammern eingeschlossen werden.

Wie im C-Standard (14.8.1/7) angegeben:

[Hinweis: Da die Liste der expliziten Vorlagenargumente dem Namen der Funktionsvorlage folgt und Vorlagen für Konvertierungs-Member-Funktionen und Konstruktor-Member-Funktionsvorlagen ohne Verwendung eines Funktionsnamens aufgerufen werden, gibt es keine Möglichkeit, eine explizite Vorlage bereitzustellen Argumentliste für diese Funktionsvorlagen. ]

Daher funktioniert das folgende Beispiel nicht:

struct T { 
    template<class> T();
};

struct U {
    U() : t<void>() {} //does not work
    T t;
};
Nach dem Login kopieren

In diesem Fall versucht der Compiler, t als Basisklassentyp und findet keinen passenden Standardkonstruktor.

Problemumgehung

Um diese Einschränkung zu umgehen, kann man eine Funktionsvorlage verwenden, die einen benötigt Identitätstyp als Argument:

struct T { 
    template<class U> T(identity<U>);
};

struct U {
    U() : t(identity<void>()) {}
    T t;
};
Nach dem Login kopieren

Angesichts der folgenden Identitätsdefinition von Boost:

template<typename T> struct identity { typedef T type; };
Nach dem Login kopieren

oder, in C 20, unter Verwendung von std::type_identity:

using ::std::type_identity;
Nach dem Login kopieren

Dieser Ansatz ermöglicht effektiv die Übergabe von Vorlagenargumenten an Konstruktoren in Initialisierungslisten.

Das obige ist der detaillierte Inhalt vonWarum kann ich einen Vorlagenkonstruktor in einer C-Initialisierungsliste nicht explizit aufrufen?. 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