【发布时间】:2016-02-15 18:09:56
【问题描述】:
typeid 表示 C++ RTTI 运算符也是 C++ 关键字。它返回一个包含(动态)类型特定信息的std::type_info 对象。
根据我从各种来源了解到的情况,使用typeid 时必须包含<typeinfo>,否则程序格式错误。事实上,如果我不包含前面提到的头文件,我的 gcc5.2 编译器甚至不会编译程序。我不明白为什么在使用 C++ keyword 时必须包含标头。我理解每当我们使用在该标头中声明/定义的某些对象时都需要一个标头,但 typeid 不是类类型。那么强制包含标头 <typeinfo> 的原因是什么?
【问题讨论】:
-
对于类似的事情,
<initializer_list>也需要包含在您可能期望或可能不期望的情况下。 -
@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。