c – type_info不是RTTI的一部分吗?

我问了一个问题 Do C++ POD types have RTTI?,有人在评论中告诉我:

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没有任何意义).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...