Advertencia del compilador (nivel 1) C4297
'función': se suponía que la función no iniciaba una excepción, pero lo hace
Una declaración de función contiene un especificador noexcept
(posiblemente implícito), un especificador de excepción throw
vacío o un atributo __declspec(nothrow), y la definición contiene una o más instrucciones throw. Para resolver la advertencia C4297, no intente iniciar excepciones en funciones declaradas __declspec(nothrow)
, noexcept(true)
o throw()
. O bien, quite la especificación noexcept
, throw()
o __declspec(nothrow)
.
De manera predeterminada, el compilador genera especificadores noexcept(true)
implícitos para destructores definidos por el usuario, funciones de desasignador y funciones miembro especiales generadas por el compilador. Esto cumple la norma ISO C ++ 11. Para evitar la generación de especificadores noexcept implícitos y revertir el compilador al comportamiento no estándar de Visual Studio 2013, use la opción del compilador /Zc:implicitNoexcept-. Para más información, consulte /Zc:implicitNoexcept (especificadores de excepción implícita).
Para más información sobre las especificaciones de excepciones, consulte Especificaciones de excepciones (throw). Consulte también /EH (Modelo de control de excepciones) para información sobre cómo modificar el comportamiento de control de excepciones en tiempo de compilación.
Esta advertencia también se genera para funciones __declspec(dllexport) marcadas como extern "C", incluso si son funciones de C++.
El siguiente ejemplo genera la advertencia C4297.
// C4297.cpp
// compile with: /W1 /LD
void __declspec(nothrow) f1() // declared nothrow
// try the following line instead
// void f1()
{
throw 1; // C4297
}