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

vso*_*tco 12 c++ rtti typeid

所述typeid表示C++ RTTI操作者还为C++关键字.它返回一个std::type_info保存(动态)类型特定信息的对象.

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

mat*_*oss 8

下一段:

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

因为它是一个左值表达式,它使用引用初始化来声明初始化器std::type_info.<typeinfo>包含该对象的定义.

  • 可能这就是原因,虽然我找到了语言的设计......让我们说奇怪,因为它允许关键字依赖于标题...... (2认同)

Abd*_*man 5

typeid 并不是唯一需要标题的人

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

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

请参阅abhay关于新关键字的答案

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

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;
}
Run Code Online (Sandbox Code Playgroud)

有关iso cpp纸的信息,请参阅第18.7节

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

  • size_t是一个类型别名,因此您不需要包含标头来使用sizeof的结果 (2认同)