8 Expressions [expr]

8.2 Postfix expressions [expr.post]

8.2.8 Type identification [expr.typeid]

Результатом typeid выражения является lvalue статического типа и динамического типа, или где - это класс, определяемый реализацией, публично производный от которого сохраняет поведение, описанное в . Время жизни объекта, на который указывает lvalue, продолжается до конца программы. Не определено, вызывается ли деструктор для объекта в конце программы.const std​::​type_­info const std​::​type_­info const name name std​::​type_­info [type.info]70std​::​type_­info

Когда typeid применяется к выражению glvalue, тип которого является polymorphic class типом, результат относится к std​::​type_­info объекту, представляющему тип most derived object (то есть динамический тип), на который ссылается glvalue. Если glvalue выражение получается путем применения унарную * оператора на указатель71 и указатель является null pointer value, то typeid выражение throws an exception такого типа , который будет соответствовать обработчик типа исключения.std​::​bad_­typeid

Когда typeid он применяется к выражению, отличному от glvalue типа полиморфного класса, результат относится к std​::​type_­info объекту, представляющему статический тип выражения. Lvalue-to-rvalue, array-to-pointerИ function-to-pointer конверсия не применяется к выражению. Если выражение является prvalue, temporary materialization conversion применяется. Выражение - это unevaluated operand.

Когда typeid применяется к a type-id, результат относится к std​::​type_­info объекту, представляющему тип type-id. Если тип type-idявляется ссылкой на возможно cv-квалифицированный тип, результат typeid выражения относится к std​::​type_­info объекту, представляющему cv-неквалифицированный ссылочный тип. Если тип type-idявляется типом класса или ссылкой на тип класса, класс должен быть полностью определен.

Если тип выражения или type-idявляется типом с квалификацией cv, результат typeid выражения ссылается на std​::​type_­info объект, представляющий тип с квалификацией cv. [Example:

class D { /* ... */ };
D d1;
const D d2;

typeid(d1) == typeid(d2);       // yields true
typeid(D)  == typeid(const D);  // yields true
typeid(D)  == typeid(d2);       // yields true
typeid(D)  == typeid(const D&); // yields true

end example]

Если заголовок <typeinfo> не включен до использования typeid, программа имеет неправильный формат.

[ Note: [class.cdtor] описывает поведение, typeid применяемое к объекту, находящемуся в стадии строительства или разрушения. ]end note

Рекомендуемое имя для такого класса extended_­type_­info.

Если p это выражение типа указателя, а затем *p, (*p), *(p), ((*p)), *((p)), и так далее всех удовлетворяют это требование.