嵌套 class 的静态对象可以在没有 class 定义的情况下声明

Static objects of nested class can be declared without class definition

除非定义了 class,否则无法声明 class 的静态对象...

例如..以下代码无法编译,因为class C 尚未定义....

class C;
int main()
{
    static C y;
}

但是为什么在 class B 没有被定义的情况下,下面的代码仍然可以编译??

class A
{
    class B;
    static B x;
};

在第一种情况下(在 main 函数中)定义了对象 y - 因此需要 class 定义。

在第二种情况下(在 class A 中)成员 x 仅被声明 - 它需要在 .cpp 文件中正常定义。就其定义而言,C 的定义是必需的,但它不适用于静态成员声明。

区别不在于一个 class 是内部 class 而另一个不是。区别在于 static 在 class 作用域和函数作用域中的含义不同。

在 class 范围内,它表示一个 class 范围(不是每个实例)的成员,该行是一个 声明 。您需要在 class 正文之外单独定义:

A::B A::x; // B must be complete here, and you can add an initializer

在函数范围内,它是一个静态存储持续时间的局部变量,这意味着它将在函数调用中保留其值。该行本身就是一个定义,而不仅仅是一个声明,因此它需要完整的类型。

A static object of a class cannot be declared unless the class has been defined...

不完全是。它不能被定义(或者实例化,如果你喜欢)除非class已经被定义(完整类型);只要声明了 class,它就可以 声明(但可能是 不完整类型,尚未定义)。

the following code does not compile as the class C has not been defined....

的确,它试图定义一个局部变量,这需要class定义。

But why does the following code compiles even though class B has not been defined??

因为您只声明了静态变量。要使用该变量,它还需要一个定义(只有一个,通常在源文件中)

A::B A::x;

此时类型必须完整(即已定义)。