下面的代码完美地编译,但显示运行时错误.为什么?

Sur*_*uri 0 c++ exception-handling

//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();
}
Run Code Online (Sandbox Code Playgroud)

//如果我用以下代码替换foo(),那么它运行良好

void foo()
{
  try{
    XYZ xyz(10);
  }catch(...){}
}
Run Code Online (Sandbox Code Playgroud)

And*_*nck 5

来自:http://gotw.ca/gotw/066.htm

不太明显但在标准中明确指出的是,如果catch块没有抛出(重新抛出原始异常,或抛出新的东西),并且控制到达构造函数或析构函数的catch块的末尾,那么原始异常会自动重新抛出.

从标准15.3/16

如果控制到达构造函数或析构函数的function-try-block的处理程序的末尾,则重新抛出正在处理的异常.否则,当控制到达function-try-block(6.6.3)的处理程序的末尾时,函数返回.流出函数try-block的末尾相当于没有值的返回; 这导致值返回函数(6.6.3)中的未定义行为.