考虑以下两个代码片段(按顺序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*?
在第二个示例中,您有一个类包含同一个类的实例,该实例将递归地包含同一个类的实例.
由于C++中的每个对象的大小必须至少为1,这意味着类的任何实例都abc将是无限的(1 + 1 + 1 + ...).
第一个例子不是问题,因为指向任何对象的指针的大小是常量,因此大小abc是有限的,创建这样的对象可以在不创建无限对象的情况下完成(指针可以指向nullptr或指向现有对象) .