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