2015-11-14 256 views
10

typeid表示C++ RTTI运算符也是C++关键字。它返回一个保存(动态)类型特定信息的对象std::type_info为什么在使用typeid运算符时需要#include <typeinfo>?

根据我对各种来源的理解,当使用typeid时必须包括<typeinfo>,否则该程序是不合格的。实际上,如果我不包含前面提到的头文件,我的gcc5.2编译器甚至不编译程序。我不明白为什么要使用C++ 关键字要求包含头文件。我知道每当我们使用该头部中声明/定义的某个对象时,都会强制使用头部,但typeid不是类别类型。那么包括标题<typeinfo>在内的强制执行的原因是什么?

+2

对于类似的情况,在你可能或不可能期望的情况下,还需要包含''。 – chris

+0

@chris我认为只有当你明确地使用'std :: initializer_list'时,这会更有意义,因为'std :: initializer_list'是它自己的一个类,而不是关键字,尽管被核心语言隐含地使用了。 – vsoftco

+1

是的,虽然有一些比较棘手的情况,比如'auto list = {1,2,3};'和(for auto x:{1,2,3}){}'。 – chris

回答

6

下段:

的typeid的表达是左值表达式,其是指一个物体 具有静态存储持续时间,多态类型常量的 的std :: TYPE_INFO或某些类型的从它派生的。

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

+2

可能这就是原因,尽管我找到了语言的设计......让我们说奇怪,因为它允许一个关键字依赖于标题... – vsoftco

4

typeid并不是唯一一个需要头

new也需要头<new>在某些情况下

注:隐式声明不STD引进名,则为std :: bad_alloc,和std :: size_t或库用于声明这些名称的任何其他名称。因此,引用这些函数之一而不包含头部的新表达式,删除表达式或函数调用是格式良好的。然而,引用std,std :: bad_alloc和std :: size_t是格式不正确的,除非通过包含相应的头来声明名称。末端注意

See abhay's answer on new keyword

另算sizeof返回的std ::为size_t(实际上它并不需要包括头,但在这里我要说的是,它使用它也是在一个头文件中定义的别名)

C++第5.3.3节

的的sizeof和sizeof ...的结果是类型为std恒定::为size_t。 [注:std :: size_t在标准标头<cstddef>(18.2)中定义。 - 这是在<typeinfo>

页眉<typeinfo>简介宣告结束注]

typeid使用类

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

See section 18.7 on iso cpp paper

IMO,它的C++标准设计技术,使编译器整洁,干净,轻便

+2

size_t是一个类型别名,所以你不需要包含标题来使用sizeof的结果,虽然 – vsoftco

+0

是的,我没有说它需要包含头文件 –

+0

@AbdulRehman说“typeid不是唯一需要头文件的头文件”,然后引入“sizeof”,好像你在说sizeof也需要头文件 –

相关问题