2010-08-20 3 views
5

В приведенном ниже коде:Каков тип T?

template<typename T> 
struct X {}; 

int main() 
{ 
    X<int()> x; // what is the type of T ? 
} 

Что такое тип T? Я видел что-то подобное в источниках boost.

+0

Мне было бы интересно узнать цель использования этого «синтаксиса» (кроме того, чтобы использоваться с 'std :: function',' boost :: function' или 'boost :: function_traits') – Tomaka17

+0

Но когда мы определяем ' int x = int() ', выражение' int() 'рассматривается как инициализация значения $ 8.5/7. Так что это сложно. Я думаю, – Chubsdad

+0

@chub: там ожидается тип, а не значение. –

ответ

12

Рассмотрите функцию int func(). Он имеет тип функции int(void). Он может быть неявно преобразован в тип указателя, как указано в стандарте C++ в 4.3/1, но в этом случае нет необходимости в таком преобразовании, поэтому T имеет тип функции int(void), а не указатель на него.

2

Вот что я сделал. Хотя вывод кода ниже специфичен для реализации, он много раз дает хороший намек на тип 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 (пустоты)

0

Тип 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 - это тот же тип.

Смежные вопросы