type_info不是RTTI的一部分吗?

M. *_* E. 7 c++ gcc rtti

我曾问过一个问题C++ POD类型有RTTI吗?有人在评论中告诉我:

POD类型确实有type_info,但没有RTTI,这是可能的,因为type_info并不总是RTTI.

它似乎是正确的,因为我可以获得type_infoPOD(非多态)类型.

但是当我编译这个简单的程序时:

#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 的行为

edm*_*dmz 5

抽象的

RTTI 本身并不是真正正式定义的东西:C++ 只说明什么typeiddynamic_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没有任何意义)。