typeid
- это ключевое слово, а не функция, поэтому не нужно и не может быть объявлено. Это не может быть функция, так как тогда выражение typeid(T)
, где T
является типом, будет недействительным. Это реализовано в компиляторе, а не в библиотеке.
typeinfo
не нужно иметь никаких членов данных; его метод name
позволяет обслуживать строки из того, что фактически является массивом static
. Например, рассмотрим этот простой класс, который знает свое имя:
// foo.h
class Foo {
// look ma, no data members!
public:
char const *name() const;
};
// foo.cpp
char const NAME[] = "Foo";
char const *Foo::name() const { return NAME; }
Помимо name
основной операцией над typeinfo
объектами является ==
, которая может быть реализована простым сравнением указателей между объектами; в этом случае компилятор мог бы создать большой массив typeinfo []
где-нибудь приватно, а typeid
просто индексировал бы в этот массив, чтобы получить правильный typeinfo
объект. Как это работает, однако, зависит от реализации.