SPECIAL_NOEXCEPT C26439C26439 SPECIAL_NOEXCEPT

"Es posible que este tipo de función no produzca una excepción."This kind of function may not throw. Declárelo ' noexception '.Declare it 'noexcept'."

C++ Core Guidelines F. 6: Si la función no se inicia, declárela noexceptionC++ Core Guidelines F.6: If your function may not throw, declare it noexcept

Algunos tipos de operaciones nunca deben producir excepciones.Some kinds of operations should never cause exceptions. Sus implementaciones deben ser confiables y deben controlar correctamente las condiciones de errores posibles.Their implementations should be reliable and should handle possible errors conditions gracefully. Nunca deben usar excepciones para indicar el error.They should never use exceptions to indicate failure. Esta regla marca los casos en los que tales operaciones no se marcan explícitamente como ' noexception ', lo que significa que pueden producir excepciones y no pueden transmitir suposiciones sobre su confiabilidad.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.

ComentariosRemarks

  • Los tipos especiales de operaciones son los siguientes:Special kinds of operations are the following:
    • destructoresdestructors;
    • constructores predeterminados;default constructors;
    • constructores de movimiento y operadores de asignación de movimiento;move constructors and move assignment operators;
    • funciones estándar con semántica de movimiento: STD:: Move y STD:: swap.standard functions with move semantics: std::move and std::swap.
  • Los especificadores no estándar y obsoletos como Throw () o declspec (nothrow) no son equivalentes a ' Except '.Non-standard and outdated specifiers like throw() or declspec(nothrow) are not equivalent to 'noexcept'.
  • Los especificadores explícitos noexception (false) y noexception (true) se respetan adecuadamente.Explicit specifiers noexcept(false) and noexcept(true) are respected appropriately.
  • Es posible que la advertencia siga apareciendo para las operaciones marcadas como constexpr.The warning may still appear for operations that are marked as constexpr. Esto puede cambiar en versiones futuras.This may change in future releases.

EjemploExample

Todas las funciones, excepto el destructor, advertirán porque faltan noexception.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'
};

Con noexception al decorar la misma estructura, se quitan todas las advertencias.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*/}
};