为什么隐式声明不引入名称?
Why does the implicit declaration does not introduce the name?
我已经阅读了以下两个前面的问题,但仍然无法很好地理解。
1. 为什么使用typeid运算符时需要 #include?
2. C++什么时候需要 #include 图书馆?
由于typeid
使用type_info
类,因此要求我们#include<typeinfo>
是合理的。 但是,new operators
也使用std::bad_alloc
,为什么不需要我们#include <new>
?(我知道sizeof()
不需要<cstddef>
因为size_t
可以在编译时替换为内置类型,只要编译器知道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
,隐式声明不声明它使用的类型是一种特权吗?
前向声明用于名称查找。对于隐式声明,编译器已经知道这些名称的语义,因此它不需要执行名称查找,因此不需要前向声明(即标头)。
关键是void foo(A*);
是由你编写的,所以你必须通过前向声明告诉编译器A
是什么,而隐式声明是由编译器编写的,所以你不需要告诉编译器声明中使用的名称是什么。
请注意,上述原因不足以解释为什么在使用typeid
之前需要<typeinfo>
。事实上,这一规则在标准[expr.typeid]第6段中明确规定:
如果在使用
typeid
之前未包含标头<typeinfo>
,则程序格式不正确。
- 为什么在定义函数之前先声明它
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 为什么C++编译器没有检测到正确声明的类?
- 包含的类类型显然没有声明,为什么?
- 为什么我必须以这种方式声明指针?
- 为什么我们将单个或多维数组的大小声明为常量值?
- 为什么函数声明中允许 const?
- 如果 x.h 仅由函数声明组成,为什么有必要在 x 中包含 x.h.cpp
- 为什么即使我声明了朋友类,我也会收到错误"无法访问类中声明的私人成员"
- 为什么 C++ 中的以下结构声明会导致退出 127?
- 为什么在我的 main 函数中声明整数后我的整数数组中会出现错误?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 我无法正确获取这些变量声明...为什么这些参数不起作用?我只是将 n 值设置为数组长度
- 默认参数声明:为什么默认字符串参数必须是 const
- 声明和带有定义的声明.为什么不允许这样做
- 类作为模板参数的前向声明.为什么会这样呢?
- 语法错误:需要声明.为什么gsoap不能读取vector