我已经阅读了以下两个早期的问题,但仍然没有很好的承诺
1. Why do I need to #include when using the typeid operator?
2. When is #include library required in C++?
由于typeid
使用type_info
类,因此要求我们#include<typeinfo>
是合理的。
但是, new operators
也使用std::bad_alloc
,为什么不要求我们#include <new>
?(我知道sizeof()
不需要<cstddef>
1}}因为size_t
coulde在编译期间被内置类型替换,只要编译器知道size_t
实际上是什么。)
根据第二个问题中投票最多的答案,他说:
注意:隐式声明不会引入名称std,std :: bad_alloc和std :: size_t ,或者库用于声明这些名称的任何其他名称。因此,在不包括头部的情况下引用这些函数之一的newexpression,delete-expression或函数调用是格式良好的。但是,引用std,std :: bad_alloc和std :: size_t是不正确的,除非通过包含适当的头声明了名称。
上面的段落令人困惑,因为每次我们使用类型时,我们都需要在使用之前声明类型class A;void foo(A*);
而void* operator new(std::size_t) throw(std::bad_alloc);
的隐式声明也有键入std::bad_alloc
,隐式声明是否有权声明它使用的类型?
答案 0 :(得分:1)
转发声明用于名称查找。对于隐式声明,编译器已经知道这些名称的语义,因此它不需要执行名称查找,因此前向声明(即标题)是不必要的。
关键是void foo(A*);
是由你编写的,所以你必须通过前向声明告诉编译器A
是什么,而隐式声明是由编译器,因此您无需告诉编译器声明中使用的名称是什么。
请注意,上述原因不足以解释在使用<typeinfo>
之前需要typeid
的原因。实际上,此规则在标准[expr.typeid] paragraph 6中明确说明:
如果在使用
<typeinfo>
之前未包含标题typeid
,则该程序格式不正确。