Нарушает ли вызов std::terminate noexcept?

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 or std::unexpected (до C 17):

Следовательно, вы могли бы даже создать исключение my_fun , оно std::terminate также будет вызываться. noexcept просто означает, что исключение не будет перемещаться вверх по стеку вызовов my_fun .

Ответ №2:

Вы правы и можете безопасно определить свою функцию noexcept .

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

Если вы вызовете функцию, которая генерирует исключение, это будет проверено в конце области действия вашей функции, в которой она завершит вашу программу.