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
ystd::swap
.
Especificadores no estándar y obsoletos como
throw()
odeclspec(nothrow)
no son equivalentes anoexcept
.Los especificadores explícitos
noexcept(false)
ynoexcept(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*/}
};