为什么C++不需要类成员的前向声明?

Meh*_*dad 12 c++ forward-declaration

我的印象是C++中的所有内容必须在使用之前声明.

事实上,我记得读过这就是为什么auto在返回类型中使用C++ 0x无效的原因decltype:编译器评估函数体之前必须知道声明的类型.

想象一下,当我注意到(经过很长一段时间)以下代码实际上完全合法时,我感到很惊讶:

[编辑:更改示例.]

class Foo
{
    Foo(int x = y);
    static const int y = 5;
};
Run Code Online (Sandbox Code Playgroud)

所以现在我不明白:

为什么编译器在类中需要前向声明,而在其他地方需要它们?

Ben*_*igt 10

标准说(第3.3.7节):

在类中声明的名称的潜在范围不仅包括名称的声明点后面的声明性区域,还包括所有函数体,非静态数据成员的大括号或等于初始值,以及默认参数. class(包括嵌套类中的这类东西).

这可能是通过延迟内联成员函数的处理主体直到解析整个类定义之后完成的.


K-b*_*llo 6

类主体中的函数定义被视为在定义类之后实际定义它们.所以你的代码相当于:

class Foo
{
    Foo();
    int x, *p;
};
inline Foo::Foo() { p = &x; }
Run Code Online (Sandbox Code Playgroud)