Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Функция объявлена
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 из сигнатуры функции.