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

时间:2013-07-15 15:19:14

标签: c++ exception c++11 constructor

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

class X
{
public:
    X();
    X(int) : X() { throw std::exception(); } // is ~X() implicitely called?
    ~X();
};

2 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:5)

  

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

source

here是关于委托构造函数的好文章,如果有人想阅读的话。