Выбор ответа Senior Исключения обновлено

Бросок из noexcept-функции

Вопрос

Что произойдёт, если функция, помеченная noexcept, выбросит исключение?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Вызовется std::terminate, раскрутка стека до этого не гарантирована. noexcept это обещание, нарушение которого проверяется в рантайме: исключение, покидающее такую функцию, вызывает std::terminate.

Варианты ответа

  1. Исключение пролетит дальше, как обычно, noexcept только подсказка
  2. Будет неопределённое поведение, как при нарушении любого контракта
  3. Компилятор не скомпилирует функцию с throw внутри тела noexcept
  4. Вызовется std::terminate, раскрутка стека до этого не гарантированаправильный ответ

Разбор

noexcept это обещание, нарушение которого проверяется в рантайме: исключение, покидающее такую функцию, вызывает std::terminate. Компилятор может не генерировать таблицы раскрутки для таких функций, поэтому стек может не раскрутиться. Это не UB, поведение определено.

  • Исключение не может покинуть noexcept-функцию.
  • Внутри noexcept-функции бросать можно, если ловить внутри же: компиляция разрешена (GCC лишь предупредит, если throw очевидно вылетает наружу).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме