C26439 SPECIAL_NOEXCEPTC26439 SPECIAL_NOEXCEPT

"Этот тип функции может не вызывать исключение."This kind of function may not throw. Объявите ", за исключением". "Declare it 'noexcept'."

C++ Core Guidelines F. 6. Если функция не может создавать исключение, объявите ее, КромеC++ Core Guidelines F.6: If your function may not throw, declare it noexcept

Некоторые виды операций не должны вызывать исключения.Some kinds of operations should never cause exceptions. Их реализации должны быть надежными и надлежащим образом обрабатывать возможные ошибки.Their implementations should be reliable and should handle possible errors conditions gracefully. Они никогда не должны использовать исключения для обозначения сбоя.They should never use exceptions to indicate failure. Это правило помечает случаи, когда такие операции не помечены явно как "без", что означает, что они могут создавать исключения и не могут передавать допущения о надежности.This rule flags cases where such operations are not explicitly marked as 'noexcept' which means that they may throw exceptions and cannot convey assumptions about their reliability.

RemarksRemarks

  • Ниже перечислены специальные виды операций.Special kinds of operations are the following:
    • деструкторыdestructors;
    • конструкторы по умолчанию;default constructors;
    • конструкторы перемещения и операторы присваивания перемещения;move constructors and move assignment operators;
    • стандартные функции с семантикой перемещения: std:: Move и std:: swap.standard functions with move semantics: std::move and std::swap.
  • Нестандартные и устаревшие описатели, такие как Throw () или declspec (throw), не эквивалентны ", кроме".Non-standard and outdated specifiers like throw() or declspec(nothrow) are not equivalent to 'noexcept'.
  • Явные спецификаторы except (false) и Except (true) учитываются соответствующим образом.Explicit specifiers noexcept(false) and noexcept(true) are respected appropriately.
  • Предупреждение может по-прежнему отображаться для операций, помеченных как constexpr.The warning may still appear for operations that are marked as constexpr. Это может измениться в будущих выпусках.This may change in future releases.

ПримерExample

Все функции, кроме деструктора, будут выдавать предупреждение, так как они отсутствуют.All functions except the destructor will warn because they are missing 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'
};

Если для не задана та же структура, удаляются все предупреждения.With noexcept decorating the same structure, all warnings are removed.

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*/}
};