为什么隐式声明不引入名称?

时间:2018-02-28 06:21:55

标签: c++

我已经阅读了以下两个早期的问题,但仍然没有很好的承诺 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隐式声明是否有权声明它使用的类型?

1 个答案:

答案 0 :(得分:1)

转发声明用于名称查找。对于隐式声明,编译器已经知道这些名称的语义,因此它不需要执行名称查找,因此前向声明(即标题)是不必要的。

关键是void foo(A*);是由编写的,所以你必须通过前向声明告诉编译器A是什么,而隐式声明是由编译器,因此您无需告诉编译器声明中使用的名称是什么。

请注意,上述原因不足以解释在使用<typeinfo>之前需要typeid的原因。实际上,此规则在标准[expr.typeid] paragraph 6中明确说明:

  

如果在使用<typeinfo>之前未包含标题typeid,则该程序格式不正确。