【问题标题】:Why do I need to #include <typeinfo> when using the typeid operator?为什么在使用 typeid 运算符时需要#include <typeinfo>?
【发布时间】:2016-02-15 18:09:56
【问题描述】:

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

根据我从各种来源了解到的情况,使用typeid 时必须包含&lt;typeinfo&gt;,否则程序格式错误。事实上,如果我不包含前面提到的头文件,我的 gcc5.2 编译器甚至不会编译程序。我不明白为什么在使用 C++ keyword 时必须包含标头。我理解每当我们使用在该标头中声明/定义的某些对象时都需要一个标头,但 typeid 不是类类型。那么强制包含标头 &lt;typeinfo&gt; 的原因是什么?

【问题讨论】:

  • 对于类似的事情,&lt;initializer_list&gt; 也需要包含在您可能期望或可能不期望的情况下。
  • @chris 我认为只有当您明确使用std::initializer_list 时,这才更有意义,因为std::initializer_list 是它自己的一个类,而不是关键字,尽管核心语言隐式使用.
  • 是的,尽管有一些更棘手的情况,例如 auto list = {1, 2, 3};for (auto x : {1, 2, 3}) {}
  • @chris 是的,但是您是否必须在刚才提到的情况下包含标题?据我所知,类型推断为initializer_list,无需包含标题。这在某种意义上更奇怪,因为list 现在是对象类型std::initializer_list。哦,是的,你需要包含它......奇怪而丑陋的设计imo。
  • 是的,如果在使用 std::initializer_list 之前没有包含标头 ——即使是未命名类型的隐式使用(7.1.6.4)——程序格式错误。 ([dcl.init.list]/2) 链接指向auto。至于第二个,有this question

标签: c++ rtti typeid


【解决方案1】:

typeid 不是唯一需要标头的

new 在某些情况下还需要标头&lt;new&gt;

注意:隐式声明不引入名称 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 在标准头文件&lt;cstddef&gt;(18.2) 中定义。——结束注]

typeid 使用在&lt;typeinfo&gt; 标头中声明的类

标题&lt;typeinfo&gt;概要

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

See section 18.7 on iso cpp paper

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

【讨论】:

  • size_t 是一个类型别名,所以你不需要包含标题来使用 sizeof 的结果
  • @AbdulRehman 说“typeid 不是唯一需要标头的”,然后引入“sizeof”似乎您是在说 sizeof 也需要标头。
  • new T 不需要&lt;new&gt;,只有new 的某些用途才需要。正如您的报价所解释的那样。
【解决方案2】:

下一段:

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

因为它是一个左值表达式,它使用reference initialization来声明std::type_info的初始化器。 &lt;typeinfo&gt; 包含 that object 的定义。

【讨论】:

  • 可能是这个原因,虽然我觉得语言的设计...让我们说奇怪,因为它允许关键字依赖于标题...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 2015-11-22
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多