我曾问过一个问题C++ POD类型有RTTI吗?有人在评论中告诉我:
POD类型确实有type_info,但没有RTTI,这是可能的,因为type_info并不总是RTTI.
它似乎是正确的,因为我可以获得type_info
POD(非多态)类型.
但是当我编译这个简单的程序时:
#include <iostream>
struct X
{
int a;
};
int main()
{
using namespace std;
std::cout << typeid(X) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
与-fno-rtti
海湾合作委员会的旗帜:
$ g++ -fno-rtti main.cpp && ./main
Run Code Online (Sandbox Code Playgroud)
它不会编译:
main.cpp: In function ‘int main()’:
main.cpp:12:26: error: cannot use typeid with -fno-rtti
std::cout << typeid(X) << std::endl;
^
Run Code Online (Sandbox Code Playgroud)
这是否意味着type_info
是RTTI的一部分,还是仅仅是GCC 的行为?
RTTI 本身并不是真正正式定义的东西:C++ 只说明什么typeid
和dynamic_cast
做什么,而不是它们是如何实现的。但是,将此类操作组合在一个通用名称 RTTI 下确实很方便。
通知的实现,则没有必须严格获得在运行时也就是这个信息
if ( typeid(int) == typeid(double) )
也可以在程序评估期间确定,就像std::is_same
. int
不可否认的是非多态的(它没有“动态”类型)。cppreference甚至声称:
当应用于多态类型的表达式时,typeid 表达式的计算可能涉及运行时开销(虚拟表查找),否则 typeid 表达式在编译时解析。
但要谨慎对待。
这是否意味着 type_info 是 RTTI 的一部分,还是只是 GCC 的一种行为?
type_info
是一个类。您不能构造该类型的任何对象 - 您只能通过typeid
.
-fno-rtti
在 GCC 下禁用 RTTI:您不能使用typeid
,因此也不能使用type_info
。他们彼此非常接近。
总而言之,原文是完全正确的:
POD 类型确实有
type_info
,但没有 RTTI,这是可能的,因为 type_info 并不总是 RTTI。
运行时信息可通过 获得typeid
。没有什么动态需要考虑(实际上,dynamic_cast
没有任何意义)。