#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,我收到链接错误:
undefined reference to `d’
但是在g++ 4.8.1,它运作良好,我得到了结果:
1D
8
我的问题:
>哪一个是对的?
> g如何实现typeid?如何在没有定义的情况下从多态对象中获取信息?
解决方法
a) If expression is a glvalue expression that identifies an object of a polymorphic type (that is,a class that declares or inherits at least one virtual function),the
typeidexpression evaluates the expression and then refers to thestd::type_infoobject that represents the dynamic type of the expression. If the result of the evaluated expression is a null pointer,an exception of typestd::bad_typeidor a type derived fromstd::bad_typeidis thrown.
听起来像clang 3.4是对的.
更新
标准说:
When
typeidis applied to a glvalue expression whose type is a polymorphic class type (10.3),the result refers to astd::type_infoobject representing the type of the most derived object (1.8) (that is,the dynamic type) to which the glvalue refers. If the glvalue expression is obtained by applying the unary * operator to a pointer and the pointer is a null pointer value (4.10),the typeid expression throws thestd::bad_typeid
exception (18.7.3).
它与cppreference.com使用的语言略有不同,但仍然指出clang 3.4是正确的.