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+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...