Совместимы ли goto и деструкторы? - PullRequest
17 голосов
/ 02 декабря 2008

Этот код приводит к неопределенному поведению:


void some_func() {
  goto undefined;
  {
    T x = T();
    undefined:
  }
}

Конструктор не вызывается.

А как насчет этого кода? Будет ли называться деструктор x? Я думаю, что будет, но я хочу быть уверен. :)


void some_func() {
  {
    T x = T();
    goto out;
  }
  out:
}

1 Ответ

43 голосов
/ 02 декабря 2008

Да, деструкторы будут вызываться, как и ожидалось, так же, как если бы вы вышли из области раньше из-за исключения.

Стандарт 6,6 / 2 (операторы перехода):

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

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