Результатом 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)), и так далее всех удовлетворяют это требование.