Выбор ответа Senior Исключения обновлено
Бросок из noexcept-функции
Вопрос
Что произойдёт, если функция, помеченная noexcept, выбросит исключение?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Вызовется std::terminate, раскрутка стека до этого не гарантирована. noexcept это обещание, нарушение которого проверяется в рантайме: исключение, покидающее такую функцию, вызывает std::terminate.
Варианты ответа
- Исключение пролетит дальше, как обычно,
noexceptтолько подсказка - Будет неопределённое поведение, как при нарушении любого контракта
- Компилятор не скомпилирует функцию с
throwвнутри телаnoexcept - Вызовется
std::terminate, раскрутка стека до этого не гарантированаправильный ответ
Разбор
noexcept это обещание, нарушение которого проверяется в рантайме: исключение, покидающее такую функцию, вызывает std::terminate. Компилятор может не генерировать таблицы раскрутки для таких функций, поэтому стек может не раскрутиться. Это не UB, поведение определено.
- Исключение не может покинуть noexcept-функцию.
- Внутри noexcept-функции бросать можно, если ловить внутри же: компиляция разрешена (GCC лишь предупредит, если throw очевидно вылетает наружу).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.