在多态对象上使用typeid时,必须定义它

When using typeid on a polymorphic object, must it be defined?

本文关键字:定义 typeid 对象 多态      更新时间:2023-10-16

在多态对象上使用typeid时,我认为必须定义对象(不仅仅是声明),因为typeid操作需要在运行时获得对象的信息。下面是我的代码:

#include <iostream>
#include <typeinfo>
class D {
    virtual ~D() {}
};
extern D d;
int main()
{
    std::cout << typeid(d).name() << std::endl;
    std::cout << sizeof(d) << std::endl;
}

和clang 3.4,我得到了链接错误:

对' d'的未定义引用

但是在g++ 4.8.1中,它工作得很好,我得到了结果:

1 d
8

我的问题:

  1. 哪一个是正确的?
  2. g++如何实现typeid ?它如何从没有定义的多态对象中获取信息?

From http://en.cppreference.com/w/cpp/language/typeid

a)如果表达式是标识多态类型对象(即声明或继承至少一个虚函数的类)的glvalue表达式,则typeid表达式求该表达式的值,然后引用表示该表达式动态类型的std::type_info对象。如果求值表达式的结果为空指针,则抛出std::bad_typeid类型或std::bad_typeid派生类型的异常。

听起来clang 3.4是对的。

标准规定:

typeid应用于一个多态类类型(10.3)的glvalue表达式时,结果指向一个std::type_info对象,该对象表示该glvalue所指向的最派生对象(1.8)的类型(即动态类型)。如果glvalue表达式是通过对指针应用一元*操作符获得的,并且该指针是空指针值(4.10),则typeid表达式抛出std::bad_typeid异常(18.7.3)。

它与cppreference.com使用的语言略有不同,但它仍然指向clang 3.4是正确的。