2010-06-08 3 views
1

Я попытался это и есть выход, как: пустотыМожет ли typeid() использоваться для передачи функции?

Пожалуйста, объясните следующий код:

#include <cstdio> 
#include <typeinfo> 
using namespace std ; 

void foo() 
{ } 

int main(void) 
{ 
    printf("%s", 
    typeid(foo()).name());// Please notice this line, is it same as typeid().name() ? 
    return 0; 
} 

AFAIK: Оператор TypeId позволяет типа объекта, который определяется во время выполнения.

Итак, этот пример кода сообщает нам, что функция, которая возвращает void, имеет тип ** void **. Я имею в виду, что функция является методом и не имеет типа. Верный?

ответ

6

typeid не работает с объектов. Он работает с выражениями .

typeid возвращает тип выражения, которое вы передаете ему в качестве аргумента. Выражение может относиться к объекту или к тому, что не является объектом. В качестве аргумента вы указали выражение foo(). Это выражение имеет тип void. Итак, вы получили результат, который относится к типу void. void, BTW, не является типом объекта.

Функция имеет типы. Если вы хотите применить typeid к самой функции, синтаксис будет typeid(foo). Преобразование функции в указатель не применяется к аргументу typeid, что означает, что вы должны получить результат, который относится к самому типу функции. Между тем, typeid(&foo) даст вам идентификатор типа указателя функции, который отличается от typeid(foo).

+0

+1 просто чтобы добавить немного ясности в уже правильный ответ, выражение 'typeid (foo())' сначала вызывает функцию 'foo()', а затем делает ' typeid' на возвращаемое значение 'foo()' '', которое является 'void' –

+1

@John Dibling: Это не совсем точно. Функция называется * not *. 'typeid' оценивает свое выражение только тогда, когда имеет тип полиморфного класса. Во всех остальных случаях (включая этот) он похож на 'sizeof', что означает, что выражение аргумента * не * оценивается. – AnT

+0

А, хорошо. –

2

Это говорит вам о типе возврата функции.

Чтобы получить тип самой функции, вы хотите:

typeid(foo)  // note the lack of() 
1

Wrong по обоим пунктам.

1) Образец кода сообщает вам, что тип результата вызова foo() недействителен.

2) Функции также являются типами.

+1

Функции, безусловно, не являются типами, хотя они имеют * есть * тип. :) – avakar

+1

@avakar - это довольно педантичная проблема, но на основе языка стандарта мне придется не согласиться. 3.9.2/1 «Составные типы могут быть построены следующими способами: ... -/functions/...» и 8.3.5/1 «... тип этой формы является/функцией типа/, (slants, предназначенные для обозначения курсивного текста в тексте) –

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