C++类编译

Abh*_*hak 5 c++ compilation class

为什么以下编译?

class A{
    A(){
        A* a = new A() ;
    }
} ;
Run Code Online (Sandbox Code Playgroud)

它不应该因为失败的原因而失败吗?

class A{
    A obj;
} ;
Run Code Online (Sandbox Code Playgroud)

use*_*301 4

class A{
    A obj;
} ;
Run Code Online (Sandbox Code Playgroud)

是一个递归炸弹,因为A它的大小是基于A. 显然这是不能允许的。A不知道A也永远不会知道有多大。这在编译时很容易捕获。

class A{
    A(){
        A* a = new A() ;
    }
} ;
Run Code Online (Sandbox Code Playgroud)

仍然是递归炸弹,但它会在运行时爆炸,使其成为逻辑错误而不是语法错误。编译器可能会发出警告。

这里的秘密是,类中定义的函数是通过内联函数的魔力实现的([dcl.fct.spec]第 3 点,但在最新的标准草案中似乎是[dcl.inline]下的第 4 点) ,并在类定义后在其他代码中使用时进行编译(或者根本不编译,正如MM在下面指出的,如果该函数从未使用过)。

由于函数在编译之前将被移动到类定义之外,因此A在编译函数时就知道 的大小,因此可以安全地构造它。

至于A* a,那只是一个指针。尺寸是直接烘烤出来的,没有特殊要求。