为什么在 C++ classes 中定义的方法在引用仅在 class 中稍后出现的方法时不需要前向声明?

Why don't methods defined in classes in C++ need forward declarations when referring to methods that only show up later in the class?

为什么这是一个编译错误:

void f() {
    g();
}

void g() {

}

但不是这个:

class X {
    void a() {
        b();
    }

    void b() {
        
    }
};

我假设编译器会(至少,通常)从上到下、从左到右读取代码,这就是我们需要在第一段代码中定义的原因在 f() 之前的 void g() 前向声明使代码编译。但这种逻辑似乎不适用于 类 -- 为什么?

因为 class 的所有成员都必须在其中声明,语言假定 class 有一个 authorship(这可能包括许多个人作者)。因此,在技术上可行的情况下提供正向查找的 便利性 是合理的。

这也避免了成员函数和数据成员的前向声明的需要,因此不允许。

同样的论点不适用于非成员函数的开放集,尤其是在全局命名空间中;查找考虑翻译单元后面不相关组件引入的函数会有问题,特别是如果声明在使用前可用,但由于命名空间搜索顺序,后面的声明可能 override 它或者更好的参数匹配。例如,在使用 之后,用 auto 声明的函数的 return 类型可能会过时。它也可能甚至在模板之外也不清楚名称是指类型还是模板,引入了 typenametemplate 解析器指南的所有 复杂性 .

C 始于 1972 年; C++ 诞生于 1985 年。C++ 继承了 C 的前向声明要求和头文件设计,并保留了兼容性行为,但能够改进一些东西 类,而 C 没有。