Предупреждение C26447
Функция объявлена
noexcept
, но вызывает функцию function_name , которая может вызывать исключения (f.6).
Основные рекомендации по C++
F.6. Если функция не может вызываться, объявите ее noexcept.
Замечания
Это правило изменяет другое правило, C26440 DECLARE_NOEXCEPT, которое пытается найти функции, которые являются хорошими кандидатами для обозначения как noexcept
. В этом случае идея заключается в том, что как только вы помечаете какую-то функцию как noexcept
, она должна сохранить свой контракт, не вызывая другой код, который может вызывать исключения.
- Компилятор Microsoft C++ уже обрабатывает простые нарушения, такие как
throw
инструкции в теле функции (см. раздел C4297). - Правило фокусируется только на вызовах функций. Он помечает целевые объекты, которые не
constexpr
являются и которые могут потенциально вызывать исключения. Другими словами, они не помечены явным образом как неисключаемые с помощьюnoexcept
,__declspec(nothrow)
или throw(). - Созданные компилятором целевые функции пропускаются для снижения шума, так как спецификации исключений не всегда предоставляются компилятором.
- Средство проверки также пропускает специальные типы целевых функций, которые мы ожидаем, что вы реализуете как
noexcept
; это правило применяется SPECIAL_NOEXCEPT C26439.
Пример
#include <vector>
#include <string>
#include <istream>
std::vector<std::string> collect(std::istream& is) noexcept
{
std::vector<std::string> res;
for (std::string s; is >> s;) // C26447, `operator bool()` can throw, std::string's allocator can throw
res.push_back(s); // C26447, `push_back` can throw
return res;
}
Эти предупреждения можно исправить, удалив noexcept
из сигнатуры функции.