Compartir a través de


Advertencia C26439

Es posible que este tipo de función no se genere. Declare "noexcept".

Directrices básicas de C++ F.6: si la función no debe iniciarse, declarela. noexcept

Algunas operaciones nunca deben iniciar excepciones. Sus implementaciones deben ser confiables y deben controlar correctamente las posibles condiciones de error. No deben usar excepciones para indicar un error. Esta regla marca los casos en los que estas operaciones no están marcadas explícitamente como noexcept, lo que significa que pueden producir excepciones y los consumidores no pueden hacer suposiciones sobre su confiabilidad.

Es importante que estas funciones sean confiables, ya que a menudo se usan como bloques de creación para implementar funciones con garantías de seguridad de excepciones. Un constructor de movimiento que produce obligará a los contenedores de la Biblioteca de plantillas estándar (STL) a revertir a las operaciones de copia, lo que reduce el rendimiento del tiempo de ejecución.

Nombre del análisis de código: SPECIAL_NOEXCEPT

Comentarios

  • Tipos especiales de operaciones:

    • destructores;
    • constructores de movimiento y operadores de asignación de movimiento;
    • funciones estándar con semántica de movimiento: std::move y std::swap.
  • Especificadores no estándar y obsoletos como throw() o declspec(nothrow) no son equivalentes a noexcept.

  • Los especificadores explícitos noexcept(false) y noexcept(true) se respetan adecuadamente.

Ejemplo

La herramienta advierte sobre todas las funciones excepto el destructor porque faltan noexcept.

struct S
{
    ~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 noexcept la decoración de la misma estructura, se quitan todas las advertencias.

struct S
{
    ~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*/}
};

Consulte también

C26455
Directrices básicas de C++ F.6