使用typeid运算符时,为什么需要#include <typeinfo>?

时间:2015-11-14 04:02:46

标签: c++ rtti typeid

typeid表示C ++ RTTI运算符也是C ++关键字。它返回一个std::type_info对象,该对象包含(动态)类型特定信息。

根据我从各种来源的理解,使用<typeinfo>时必须包含typeid,否则程序就会形成错误。事实上,如果我不包含前面提到的标题,我的gcc5.2编译器甚至不编译程序。我不明白为什么要使用C ++ 关键字的标题包含。我理解,只要我们在该标头中使用声明/定义的对象,就强制使用标头,但typeid不属于类类型。那么强制执行包含标题<typeinfo>

的原因是什么呢?

2 个答案:

答案 0 :(得分:8)

下一段:

  

typeid表达式是lvalue表达式,它引用一个对象   具有静态存储持续时间的多态类型const   std :: type_info或从中派生的某种类型。

因为它是一个左值表达式,它使用reference initialization来声明std::type_info的初始值设定项。 <typeinfo>包含that object的定义。

答案 1 :(得分:5)

typeid不是唯一需要标题

的人 在某些情况下,

new还需要标头<new>

  

注意:隐式声明不会引入名称std,std :: bad_alloc和std :: size_t,或者库用于声明这些名称的任何其他名称。因此,在不包括头部的情况下引用这些函数之一的新表达式,删除表达式或函数调用是格式良好的。但是,引用std,std :: bad_alloc和std :: size_t是不正确的,除非通过包含适当的头声明了名称。 - 注意

See abhay's answer on new keyword

另一个返回std :: size_t的运算符sizeof(它实际上不需要包含头,但我的观点是它使用的是一个也在头文件中定义的别名)

C ++§5.3.3

  

sizeof和sizeof ...的结果是std :: size_t类型的常量。 [注意:std :: size_t在标准标题<cstddef>中定义(18.2).- end note]

typeid使用在<typeinfo>标题

中声明的类

标题<typeinfo>简介

namespace std {
class type_info;
class bad_cast;
class bad_typeid;
}

See section 18.7 on iso cpp paper

IMO,它的C ++标准设计技术,保持编译器整洁,干净和轻量级