son*_*yao 7 c++ g++ typeid language-lawyer clang++
在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;
}
Run Code Online (Sandbox Code Playgroud)
使用clang 3.4,我收到链接错误:
对'd'的未定义引用
但是使用g ++ 4.8.1,它运行良好,我得到了结果:
1D
8
我的问题:
typeid?如何在没有定义的情况下从多态对象中获取信息?来自http://en.cppreference.com/w/cpp/language/typeid
a) 如果表达式是标识多态类型对象(即声明或继承至少一个虚函数的类)的泛左值表达式,则该
typeid表达式计算该表达式,然后引用表示std::type_info该动态类型的对象表达方式。如果计算表达式的结果是空指针,则抛出类型std::bad_typeid或派生类型的异常。std::bad_typeid
听起来 clang 3.4 是对的。
更新
标准说:
当
typeid应用于类型为多态类类型 (10.3) 的泛左值表达式时,结果引用表示std::type_info泛左值所引用的最派生对象 (1.8)(即动态类型)类型的对象。如果泛左值表达式是通过将一元 * 运算符应用于指针而获得的,并且该指针是空指针值 (4.10),则 typeid 表达式将引发异常std::bad_typeid(18.7.3)。
它与 cppreference.com 使用的语言略有不同,但仍然表明 clang 3.4 是正确的。