Поделиться через


Предупреждение 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*/}
};