Странное поведение оператора typeid? - PullRequest
3 голосов
/ 10 января 2011

Используя XCode 3.2.3 (64-бит), я получаю странный вывод.Что я делаю неправильно?

#include <iostream>
#include <typeinfo>

struct student {

};

int main()  
{  
    int i;
    student obj;

    std::cout << typeid(i).name() << "\n";
    std::cout << typeid(obj).name() << "\n";

    return 0;
}

Выход:

i  
7student

Ответы [ 2 ]

7 голосов
/ 10 января 2011

Функция-член name() структуры type_info зависит от реализации. Нет никакой гарантии, что он попытается вернуть то, что соответствует исходной программе. Фактически, стандарт ISO C ++ (18.5.1.7) фактически говорит, что эта функция возвращает «NTBS, определяемый реализацией» (строка байтов с нулевым символом в конце). Если бы он захотел, он мог бы всегда возвращать строку «еще больше, я не скажу вам имя этого типа». Это отличается от типа Java Class<?>, который имеет очень строгие ограничения на то, что он может и не может вернуть.

4 голосов
/ 10 января 2011

В том, что происходит, нет ничего особенного.Просто typeid не обещает вернуть «оригинальное» имя типа, а просто имя.

Функция возвращает определяемую реализацией строку , которая, если вам повезет, распознаваема, но ничего не обещает.

...