Вызов noexcept(false) функции

Есть вот такой код

void ThrowDecl() noexcept(false) {}

void Throwing() noexcept(false) {
    throw std::exception();
}

void NoThrow() noexcept {
    ThrowDecl();
    Throwing();
    throw std::runtime_error("Error");
}

int main() {
    NoThrow();
    return 0;
}

Сейчас, при компиляции я получаю только один warning на строку throw std::runtime_error("Error"); тогда как вызов функций, которые потенциально могут выбрасывать исключения из функции, которая эти исключения выбрасывать не может, никак компилятором не отмечаются.

Вопрос: а можно ли все-таки как-то увидеть три warning?

Компилирую при помощи Visual Studio. Но если предупреждения будет показывать IDE (CLion), то меня это тоже устроит.


Ответы (1 шт):

Автор решения: HolyBlackCat

noexcept(false) эквивалентен отсутствию noexcept (везде кроме деструкторов, возможно еще чего-то).

То, что для Throwing(); нет варнинга (тогда как для прямого броска исключения он есть), выглядит как небольшая недоработка компилятора, при условии что компилятор видит тело функции. Отсутствие варнинга для ThrowDecl(); выглядит логично (как и для всех функций, тела которых компилятор не видит).

Одна из причин использовать noexcept - сообщить компилятору что-то, чего он не знает.

Например, вам, как программисту, может быть известно, что какая-то не-noexcept функция не может выбросить исключение на конкретных аргументах, или еще по какой-то причине.

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

Или наоброт, исключение возможно, но вы уверены, что не сможете продолжить нормальную работу после него, поэтому предпочтете сразу получить std::terminate.

→ Ссылка