#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; }
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
typeid
expression evaluates the expression and then refers to thestd::type_info
object that represents the dynamic type of the expression. If the result of the evaluated expression is a null pointer,an exception of typestd::bad_typeid
or a type derived fromstd::bad_typeid
is thrown.
听起来像clang 3.4是对的.
更新
标准说:
When
typeid
is applied to a glvalue expression whose type is a polymorphic class type (10.3),the result refers to astd::type_info
object 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是正确的.