Im folgenden Code:Was ist die Art von T?
template<typename T>
struct X {};
int main()
{
X<int()> x; // what is the type of T ?
}
Was die Art der T? Ich habe so etwas in den boost
Quellen gesehen.
Im folgenden Code:Was ist die Art von T?
template<typename T>
struct X {};
int main()
{
X<int()> x; // what is the type of T ?
}
Was die Art der T? Ich habe so etwas in den boost
Quellen gesehen.
Betrachten Sie die Funktion int func()
. Es hat einen Funktionstyp int(void)
. Es kann implizit in den Zeigertyp konvertiert werden, wie der C++ - Standard in 4.3/1 sagt, aber in diesem Fall besteht keine Notwendigkeit für eine solche Umwandlung, so dass T
den Funktionstyp int(void)
hat, kein Zeiger darauf.
Hier ist was ich getan habe. Obwohl die Ausgabe von Code unten implementierungsspezifisch ist, gibt es oft einen guten Hinweis auf die Art von T, mit der wir es zu tun haben.
template<typename T>
struct X {
X(){
cout << typeid(T).name();
}
};
int main()
{
X<int()> x; // what is the type of T ?
cout << typeid(int()).name() << endl;
}
Die Ausgabe auf VC++ ist
int __cdecl (void)
int __cdecl (void)
Die Art der T
eine Funktion, die keine Parameter annimmt und gibt int
, wie in:
template<typename T>
struct X {};
int foo()
{
return 42;
}
int main()
{
X<int()> x; // what is the type of T ?
typedef int(foo_ptr)();
X<foo_ptr> x2;
return 0;
}
T
in x
und x2
sind vom gleichen Typ.
Ich wäre neugierig zu wissen, den Zweck der Verwendung dieser 'Syntax' (außer mit 'std :: function',' boost :: function' oder 'boost :: function_traits') – Tomaka17
Aber wenn wir definieren ' int x = int() ', der Ausdruck' int() 'wird als Wert Initialisierung $ 8.5/7 behandelt. So ist es schwierig, ich denke – Chubsdad
@chub: ein Typ wird dort erwartet, kein Wert. –