Предупреждение C26439
Такой вид функции может не вызывать. Объявите его "noexcept".
Основные рекомендации C++ F.6. Если функция не должна вызываться, объявите ее. noexcept
Некоторые операции никогда не должны вызывать исключения. Их реализации должны быть надежными и должны обрабатывать возможные ошибки корректно. Они не должны использовать исключения для обозначения сбоя. В таких случаях флаги правил, когда такие операции не помечены noexcept
явным образом, что означает, что они могут создавать исключения и потребители не могут делать предположения о его надежности.
Важно, чтобы эти функции были надежными, так как они часто используются в качестве стандартных блоков для реализации функций с гарантиями безопасности исключений. Конструктор перемещения, который создает контейнеры стандартной библиотеки шаблонов (STL), будут возвращать операции копирования, уменьшая производительность среды выполнения.
Имя анализа кода: SPECIAL_NOEXCEPT
Замечания
Специальные виды операций:
- Деструкторы;
- перемещение конструкторов и операторов назначения перемещения;
- стандартные функции с семантикой перемещения:
std::move
иstd::swap
.
Нестандартные и устаревшие описатели, такие как
throw()
илиdeclspec(nothrow)
не эквивалентныnoexcept
.Явные описатели
noexcept(false)
иnoexcept(true)
уважаются соответствующим образом.
Пример
Средство предупреждает обо всех функциях, кроме деструктора, так как они отсутствуют noexcept
.
struct S
{
~S() {}
S(S&& s) {/*impl*/} // C26439, This kind of function may not throw. Declare it 'noexcept' (f.6)
S& operator=(S&& s) {/*impl*/} // C26439, This kind of function may not throw. Declare it 'noexcept' (f.6)
S(const S& s) {/*impl*/} // C26440, This function can be declared 'noexcept'
S& operator=(const S& s) {/*impl*/} // C26440, This function can be declared 'noexcept'
};
При noexcept
декорировании одной структуры все предупреждения удаляются.
struct S
{
~S() {}
S(S&& s) noexcept {/*impl*/}
S& operator=(S&& s) noexcept {/*impl*/}
S(const S& s) noexcept {/*impl*/}
S& operator=(const S& s) noexcept {/*impl*/}
};