Почему разрешено генерировать исключение внутри функции с тегами noexcept?
Мне трудно понять это.
double compute(double x, double y) noexcept
{
if (y == 0)
throw std::domain_error("y is zero");
return x / y;
}
это хорошо компилируется в clang (я не проверял gcc), но мне кажется, что это чепуха. Зачем компилятору разрешать функции noexcept содержать оператор throw?
2 ответа
Что будет std::terminate()
срабатывает, так как ваша спецификация исключений не позволяет этому произойти (см. [кроме.spec / 9]).
Что касается того, почему это разрешено, просто невозможно полностью проверить, не нарушает ли что-либо спецификацию. Рассмотрим что-то вроде:
double f(double );
double compute(double x, double y) noexcept
{
return x / f(y);
}
Можно f
бросить? Не могу сказать.
Вполне возможно, что функция, которая утверждает, что не выбрасывает, на самом деле выбрасывает.
Если noexcept
функция бросает, terminate
называется, тем самым обеспечивая выполнение обещания не бросать во время выполнения.
// The compiler does not check the `noexcept` specification at compile time.
void f() noexcept // Promises to not throw any exception
{
throw runtime_error("error"); // Violates the exception specification
}
Указание на то, что функция не будет выдавать, обещаетвызывающим функции, не вызывающей выдачу, что им никогда не понадобится иметь дело с исключениями.
Либо функция не сработает, либо вся программа завершится.