委托构造函数抛出时是否调用析构函数?

Ral*_*zky 15 c++ constructor exception c++11

众所周知,如果构造函数抛出,则所有完全构造的子对象将以相反的顺序销毁,包括成员数据和各种基类.但是,析构函数不会被调用非委托构造函数.对于委托构造函数,在输入构造函数体时已构造对象,但构造仍在继续.因此,如果委托构造函数从其体内抛出异常,则会出现是否调用类的析构函数的问题?

class X
{
public:
    X();
    X(int) : X() { throw std::exception(); } // is ~X() implicitely called?
    ~X();
};
Run Code Online (Sandbox Code Playgroud)

Jam*_*nze 14

规则是为所有完全构造的对象调用析构函数.一旦任何构造函数完成,该对象被认为是完全构造的,包括委托的构造函数(即使程序在另一个构造函数中继续).

  • @MarkB§15.2/ 2"[...]类似地,如果对象的非委托构造函数已完成执行并且该对象的委托构造函数以异常退出,则将调用该对象的析构函数.[...] ". (2认同)
  • @LokiAstari 没有其他任何意义(虽然我可以理解你的担忧)。非委托构造函数已将类置于已定义状态(并且可能分配了需要释放的资源),因此必须调用析构函数。在委托构造函数中,构造函数主体中的代码处于某种不确定状态:它位于构造函数中,但它不是类的原理构造的一部分。 (2认同)

Ste*_*sca 6

当任何构造函数(即,在委派的情况下,最终目标构造函数)成功完成时,对象的生命周期开始.出于[C++ 03]§3.8的目的,"构造函数调用已完成"表示任何构造函数调用.这意味着从委托构造函数的主体抛出的异常将导致自动调用destructorto.

来源.

这里是有关委派构造一个很好的文章,应该有人要读它.