gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:33 26 4
gpt4 key购买 nike

之前看了下面两个问题,还是没看懂。
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> 因为 size_t 可以在编译期间用内置类型替换,只要编译器知道 size_t 实际上是什么。)

根据第二个问题中投票最多的答案,他说:

Note: the implicit declarations do not introduce the names std, std::bad_alloc, and std::size_t, or any other names that the library uses to declare these names. Thus, a newexpression, delete-expression or function call that refers to one of these functions without including the header is well-formed. However, referring to std, std::bad_alloc, and std::size_t is ill-formed unless the name has been declared by including the appropriate header.

上面的段落令人困惑,因为每次我们使用一个类型时,我们都需要在使用之前声明一个类型,例如 class A;void foo(A*);以及 void* operator new(std::size_t) throw(std::bad_alloc);隐式声明还有一个类型 std::bad_alloc , implicit declaration 不声明它使用的类型是一种特权吗?

最佳答案

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

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

请注意,以上原因不足以解释为什么 <typeinfo>在使用 typeid 之前是必需的.事实上,这条规则在标准[expr.typeid] paragraph 6中有明确规定。 :

If the header <typeinfo> is not included prior to a use of typeid, the program is ill-formed.

关于c++ - 为什么隐式声明不引入名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49023162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com