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)
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,那只是一个指针。尺寸是直接烘烤出来的,没有特殊要求。