POD types do have type_info,but don’t have RTTI,and that’s possible
because type_info isn’t always RTTI.
它似乎正确,因为我可以得到POD(非多态)类型的type_info.
但是当我编译这个简单的程序时:
#include <iostream> struct X { int a; }; int main() { using namespace std; std::cout << typeid(X) << std::endl; return 0; }
与GCC的旗帜-fno-rtti:
$g++ -fno-rtti main.cpp && ./main
它不会编译:
main.cpp: In function ‘int main()’: main.cpp:12:26: error: cannot use typeid with -fno-rtti std::cout << typeid(X) << std::endl; ^
这是否意味着type_info是RTTI的一部分,还是仅仅是GCC的行为?
解决方法
RTTI本身并不是真正正式定义的东西:C只说明了typeid和dynamic_cast的作用,而不是它们是如何实现的.但是,确实很方便的是将这种操作分组为RTTI的通用名称.
注意,在运行时严格获取此信息不需要实现,即
if(typeid(int)== typeid(double))
也可以在程序评估期间确定,就像std :: is_same一样. int无可否认是非多态的(它没有’动态’类型). cppreference甚至声称:
When applied to an expression of polymorphic type,evaluation of a typeid expression may involve runtime overhead (a virtual table lookup),otherwise typeid expression is resolved at compile time.
但要小心谨慎.
Does that mean type_info is a part of RTTI,or is it just a behavior of GCC?
type_info是一个类.您可能无法构造该类型的任何对象 – 您只能通过typeid.
-fno-rtti
在GCC下禁用RTTI:你不能使用typeid,因此也不能是type_info.他们彼此非常亲密.
总之,原始报价是完全正确的:
POD types do have
type_info
,and that’s possible because type_info isn’t always RTTI.
运行时信息可通过typeid获得.没有动态需要考虑(事实上,dynamic_cast没有任何意义).