Совместимы ли приемники и деструкторы?

Этот код приводит к поведению undefined:


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

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

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


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

Ответ 1

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

Стандарт 6.6/2 (утверждения перехода):

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