为什么在使用类型作为字段时不能推迟不完整类型(前向声明)的大小计算?

Why incomplete type (forward declared) size calculation cannot be postponed when using type as a field?

在下面的代码中:

class B;

struct A
{
   B* b; // <- why MUST be a pointer? Why size cannot be calculated later...?
}

struct B
{
   ...
}

据我了解,struct A 必须将 b 定义为 B*,因为编译器在计算 A 的大小时无法判断 B 的大小。

我不明白的是,为什么编译器不能推迟计算直到找到 B 的完整定义(正如程序员通过转发声明 class 承诺的那样)

假设您可以实际将A定义为:

class B;

struct A {
   B b; // not a pointer
}

也就是说,b不完整类型的数据成员——此时编译器不知道B的大小。

那么,如果B被定义为:

struct B {
   A a;
}

这需要无限的内存。

原因很简单,C++ 被设计为通过源代码一次编译(或多或少);目标是编译器不必推迟编译某些东西,因为在定义它的地方没有足够的信息。