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
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!