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
Susan SarandonOriginal
2024-12-18 03:56:09452Durchsuche

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;
};

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;
};

Angesichts der folgenden Identitätsdefinition von Boost:

template<typename T> struct identity { typedef T type; };

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

using ::std::type_identity;

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!

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