c
#c
Вопрос:
Предположим, у меня есть функция, которая может вызывать std::terminate
:
int my_fun(int i) noexcept {
if(i==0) std::terminate();
return 3/i;
}
Могу ли я объявить это noexcept
? Насколько я могу судить, ничего не «выбрасывается»…
Комментарии:
1.
terminate
самоnoexcept
по себе, так что я думаю, ты молодец!2. Отлично, спасибо! Если бы вы хотели сделать это ответом, я бы принял его.
Ответ №1:
Результатом указания noexcept
является то, что вы объявили метод not throw . Другими словами, это не вызывающая функция. Тем не менее, вызывается исключение, когда вызывается исключение std::terminate
. Из cppreference:
Не вызывающим функциям разрешено вызывать потенциально вызывающие функции. Всякий раз, когда генерируется исключение и поиск обработчика обнаруживает самый внешний блок не вызывающей функции, вызывается функция
std::terminate
orstd::unexpected
(до C 17):
Следовательно, вы могли бы даже создать исключение my_fun
, оно std::terminate
также будет вызываться. noexcept
просто означает, что исключение не будет перемещаться вверх по стеку вызовов my_fun
.
Ответ №2:
Вы правы и можете безопасно определить свою функцию noexcept
.
Сама функция std::terminate
есть noexcept
и ничего не выдает. Это просто завершает вашу программу, и ваша программа никогда не достигнет оператора return или не достигнет конца области действия функции. Поскольку поведение std::terminate()
может быть переопределено с std::terminate_handler
помощью , рекомендуется использовать std::abort()
вместо этого, чтобы обеспечить правильное прерывание вашей программы.
Если вы вызовете функцию, которая генерирует исключение, это будет проверено в конце области действия вашей функции, в которой она завершит вашу программу.