C ++中结构名称的可用性

Availability of name of a structure in C++

考虑以下两个代码片段(按顺序 A 和 B):

struct abc {
    int a {};
    abc* next;
};

struct abc {
     int a {};
     abc next;
};

事实是:
1. 代码段 A 有效。
2. 代码段 B 无效。

参数:

B 无效,因为编译器在声明时无法确定片段 B 中 abc 的大小。 (Stroustrup,C++ 编程语言,8.2.2

我的疑问:

代码段A编译的时候不是需要abc的大小吗?声明指向abc的指针时是否不需要abc的大小?否则在编译期间,编译器如何知道如何取消引用 abc*?

C++ 区分声明用法。要 声明 一个指针,不需要知道指针类型的大小。但是,引用指针的代码确实需要知道它的大小。

在您的第二个示例中,您有一个 class 包含相同 class 的实例,它将递归地包含相同 class.

的实例

由于 C++ 中的每个对象的大小都必须至少为 1,这意味着 class abc 的任何实例都将是无限的 (1+1+1+...)。

第一个例子不是问题,因为指向任何对象的指针的大小都是常数,因此 abc 的大小是有限的,创建这样一个对象可以在不创建无限对象的情况下完成(指针可以指向 nullptr 或现有对象)。

使用指针算法或使用 [] 运算符进行引用时,需要变量的大小。

在编译时声明指向它的指针时不需要引用对象的大小。

代码段 B 的问题在于它不仅包含指向另一个 abc 的指针,它还包含整个 abc 的内存分配。反过来,它包含一个完整的 abc。其中包含整个 abc。其中包含整个 abc。看到我们要去哪里了吗?

代码段A没有这个问题;它只是存储一个固定大小的指针。该指针可能指向另一个有效的 abc,但它也可以指向 null、它本身、内存中的随机点或其他任何东西。