В приведенном ниже коде:Каков тип T?
template<typename T>
struct X {};
int main()
{
X<int()> x; // what is the type of T ?
}
Что такое тип T? Я видел что-то подобное в источниках boost
.
В приведенном ниже коде:Каков тип T?
template<typename T>
struct X {};
int main()
{
X<int()> x; // what is the type of T ?
}
Что такое тип T? Я видел что-то подобное в источниках boost
.
Рассмотрите функцию int func()
. Он имеет тип функции int(void)
. Он может быть неявно преобразован в тип указателя, как указано в стандарте C++ в 4.3/1, но в этом случае нет необходимости в таком преобразовании, поэтому T
имеет тип функции int(void)
, а не указатель на него.
Вот что я сделал. Хотя вывод кода ниже специфичен для реализации, он много раз дает хороший намек на тип T, с которым мы имеем дело.
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;
}
Выход на VC++ является
INT __cdecl (пустоты)
INT __cdecl (пустоты)
Тип T
является функцией, которая не принимает никаких параметров и возвращается int
, как указано:
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
в x
и x2
- это тот же тип.
Мне было бы интересно узнать цель использования этого «синтаксиса» (кроме того, чтобы использоваться с 'std :: function',' boost :: function' или 'boost :: function_traits') – Tomaka17
Но когда мы определяем ' int x = int() ', выражение' int() 'рассматривается как инициализация значения $ 8.5/7. Так что это сложно. Я думаю, – Chubsdad
@chub: там ожидается тип, а не значение. –