The result of a typeid expression is an lvalue of static type
conststd::type_info ([type.info]) and dynamic type conststd::type_info or constname where name is an
implementation-defined class publicly derived from
std::type_info which preserves the behavior described
in [type.info].48
The lifetime of the object referred to by the lvalue extends to the end
of the program.
Whether or not the destructor is called for the
std::type_info object at the end of the program is unspecified.
If the type of the expression or type-id operand is
a (possibly cv-qualified) class type or
a reference to (possibly cv-qualified) class type,
that class shall be completely defined.
When typeid is applied to a glvalue whose type is a
polymorphic class type ([class.virtual]), the result refers to a
std::type_info object representing the type of the most derived
object ([intro.object]) (that is, the dynamic type) to which the
glvalue refers.
When typeid is applied to an expression other than a glvalue of
a polymorphic class type, the result refers to a std::type_info
object representing the static type of the expression.
When typeid is applied to a type-id, the result
refers to a std::type_info object representing the type of the
type-id.
If the type of the type-id is a reference
to a possibly cv-qualified type, the result of the
typeid expression refers to a std::type_info object
representing the cv-unqualified referenced type.
If the type of the expression or type-id is a
cv-qualified type, the result of the typeid expression refers
to a std::type_info object representing the cv-unqualified
type.
[Example 1: class D {/* ... */};
D d1;
const D d2;
typeid(d1)==typeid(d2); / yields truetypeid(D)==typeid(const D); / yields truetypeid(D)==typeid(d2); / yields truetypeid(D)==typeid(const D&); / yields true — end example]