微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 在多态对象上使用typeid时,是否必须定义它?

在多态对象上使用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,我收到链接错误

undefined reference to `d’

但是在g++ 4.8.1,它运作良好,我得到了结果:

1D
8

我的问题:

>哪一个是对的?
> g如何实现typeid?如何在没有定义的情况下从多态对象中获取信息?

解决方法

http://en.cppreference.com/w/cpp/language/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 the std::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 type std::bad_typeid or a type derived from std::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 a std::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 the std::bad_typeid
exception (18.7.3).

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

原文地址:https://www.jb51.cc/c/118635.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐