следующий код прекрасно компилируется, но показывает ошибку во время выполнения. Зачем? - PullRequest
0 голосов
/ 30 апреля 2010

// 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(...){}
}

1 Ответ

5 голосов
/ 30 апреля 2010

От: http://gotw.ca/gotw/066.htm

Что менее очевидно, но ясно указано в стандарте, что если ловить блок не выкидывает (либо сбросить исходное исключение или кинь что нибудь новое) и управляй достигает конца блока улова конструктор или деструктор, то оригинальное исключение автоматически вызваны повторно.

Из стандарта 15,3 / 16

Обрабатываемое исключение: переброшен, если контроль достигает конца обработчик функции-try-block конструктор или деструктор. В противном случае функция возвращает, когда управление достигает конца обработчика для функции try-block (6.6.3). Стекает с конца function-try-block эквивалентна вернуть без значения; это приводит к неопределенное поведение в функция, возвращающая значение (6.6.3).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...