// sample.h
int calci(int &value)
{
if(value < 20)
throw value;
else
return value;
}
class XYZ
{
int m_x;
public: XYZ(int &x)try:m_x(x-calci(x))
{
}catch (int &a)
{}
};
class ABC
{
int m_a;
public: ABC():m_a(0)
{
}
void foo()
{
XYZ xyz(10);
}
};
int main()
{
ABC abc;
abc.foo();
}
//如果我用下面的代码替换foo()那么它运作良好
void foo()
{
try{
XYZ xyz(10);
}catch(...){}
}
答案 0 :(得分:5)
来自:http://gotw.ca/gotw/066.htm
什么不那么明显,但很清楚 在标准中说明,如果是 catch block不抛(或者 重新抛出原始异常,或 抛出新的东西)和控制 到达catch块的末尾 一个构造函数或析构函数,然后是 原始异常是自动的 重新抛出。
从标准15.3 / 16
正在处理的例外是 如果控制到达结束时重新生长 function-try-block的一个处理程序 构造函数或析构函数。 否则,函数返回时 控制到达处理程序的末尾 for function-try-block(6.6.3)。 流出一个结束 function-try-block相当于a 没有价值的回报;这导致了 一个未定义的行为 价值回报函数(6.6.3)。