在构造函数成员初始化器中抛出C++异常?

And*_*zos 1 c++ constructor exception c++11

考虑以下情况:

struct X { ... };

struct Y
{
     Y(...);

     ...

     X x;

     ...
}

X f()
{
    ...

    if (...)
        throw E;

    ...
}

Y::Y(...) :
    ... ,
    x(f()) ,
    ...
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这里有任何未定义的行为吗?当抛出E时,这种设计是否存在任何问题或潜在问题?

更新:

Y::x可能不是Y该类的唯一成员变量,可能不是该类中的第一个成员变量,并且可能在初始化Y::Y列表中途初始化.

K-b*_*llo 5

这里有任何未定义的行为吗?

没有.建筑Y被中止了.

当抛出E时,这种设计是否存在任何问题或潜在问题?

没有Y创建,所以没有析构函数可以调用.完全构造的元素的析构函数,即之前x在类体中声明的元素,将被自动调用(否则你怎么知道它抛出时的初始化列表有多远).如果你需要销毁任何东西,那么你必须抓住异常并自行销毁它.你不能吸收异常,你可以重新抛出它,抛出一个新的异常,或者什么都不做会导致异常被重新抛出.对于您的特定用例,不应该有任何要销毁的东西,因为根本不会调用构造函数体.