Вызов 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 шт):
noexcept(false) эквивалентен отсутствию noexcept (везде кроме деструкторов, возможно еще чего-то).
То, что для Throwing(); нет варнинга (тогда как для прямого броска исключения он есть), выглядит как небольшая недоработка компилятора, при условии что компилятор видит тело функции. Отсутствие варнинга для ThrowDecl(); выглядит логично (как и для всех функций, тела которых компилятор не видит).
Одна из причин использовать noexcept - сообщить компилятору что-то, чего он не знает.
Например, вам, как программисту, может быть известно, что какая-то не-noexcept функция не может выбросить исключение на конкретных аргументах, или еще по какой-то причине.
Или, возможно, функция никогда не бросает исключений, но noexcept на ней забыт, а вы не можете его добавить, потому что функция библиотечная.
Или наоброт, исключение возможно, но вы уверены, что не сможете продолжить нормальную работу после него, поэтому предпочтете сразу получить std::terminate.