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
列表中途初始化.
这里有任何未定义的行为吗?
没有.建筑Y
被中止了.
当抛出E时,这种设计是否存在任何问题或潜在问题?
没有Y
创建,所以没有析构函数可以调用.完全构造的元素的析构函数,即之前x
在类体中声明的元素,将被自动调用(否则你怎么知道它抛出时的初始化列表有多远).如果你需要销毁任何东西,那么你必须抓住异常并自行销毁它.你不能吸收异常,你可以重新抛出它,抛出一个新的异常,或者什么都不做会导致异常被重新抛出.对于您的特定用例,不应该有任何要销毁的东西,因为根本不会调用构造函数体.