Предупреждение C26440
Функция может быть объявлена "noexcept".
Основные рекомендации C++ F.6. Если ваша функция не может вызываться, объявите ее. noexcept
Если код не должен вызывать какие-либо исключения, он должен быть помечен с помощью noexcept
описателя. Эта заметка помогает упростить обработку ошибок на стороне клиентского кода и позволяет компилятору выполнять дополнительные оптимизации.
Замечания
- Функция считается неисключаемой, если:
- он не имеет явных
throw
операторов; - Вызовы функций в своем тексте, если таковые имеются, вызывают только функции, которые вряд ли будут вызываться:
constexpr
или функции, помеченные любой спецификацией исключения, которая влечет за собой неисключающее поведение (включая некоторые нестандартные спецификации).
- он не имеет явных
- Нестандартные и устаревшие описатели, такие как
throw()
или__declspec(nothrow)
не эквивалентныnoexcept
. - Явные описатели
noexcept(false)
иnoexcept(true)
уважаются соответствующим образом. - Функции, помеченные как
constexpr
не должны вызывать исключения и не анализируются. - Правило также применяется к лямбда-выражениям.
- Логика не рассматривает рекурсивные вызовы как потенциально не вызываемые. Эта логика может измениться в будущем.
Пример
Все функции, кроме деструктора, будут предупреждать, потому что они отсутствуют noexcept.
struct S
{
S() {} // C26455, Default constructor may not throw. Declare it 'noexcept'
~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() noexcept {}
~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*/}
};