Почему разрешено генерировать исключение внутри функции с тегами 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
}

Указание на то, что функция не будет выдавать, обещаетвызывающим функции, не вызывающей выдачу, что им никогда не понадобится иметь дело с исключениями.

Либо функция не сработает, либо вся программа завершится.

Другие вопросы по тегам