Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Функция объявлена
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 из сигнатуры функции.