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

Ujj*_*yan 2 c++

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

struct abc {
    int a {};
    abc* next;
};
Run Code Online (Sandbox Code Playgroud)

struct abc {
     int a {};
     abc next;
};
Run Code Online (Sandbox Code Playgroud)

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

参数:

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

我怀疑:

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

Kon*_*lph 9

C++区分声明使用.要声明指针,不需要知道指针类型的大小.但是,对指针进行处理的代码需要知道它的大小.


Mot*_*tti 7

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

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

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