Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Такой вид функции может не вызывать. Объявите его "noexcept".
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*/}
};
См. также
C26455
F.6. Если функция не должна вызываться, объявите ее noexcept