/Zc:noexceptTypes (reglas noexcept de C++17)

El estándar de C++17 convierte throw() en un alias para noexcept, quita throw(type-list) y throw(...), y permite que determinados tipos incluyan noexcept. Este cambio puede generar problemas de compatibilidad de código fuente con código que sea conforme a C++14 o versiones anteriores. La opción /Zc:noexceptTypes especifica la conformidad con el estándar de C++17. /Zc:noexceptTypes- permite el comportamiento de C++14 y versiones anteriores cuando el código se compila en modo C++17.

Sintaxis

/Zc:noexceptTypes[-]

Comentarios

Cuando se especifica la opción /Zc:noexceptTypes, el compilador se ajusta al estándar de C++17 y trata throw() como alias para noexcept, quita throw(type-list) y throw(...), y permite que determinados tipos incluyan noexcept. La opción /Zc:noexceptTypes solo está disponible cuando están habilitados /std:c++17, o cualquier versión posterior. /Zc:noexceptTypes está habilitado de forma predeterminada para cumplir los estándares ISO C++17 y versiones posteriores. La opción /permissive- no afecta a /Zc:noexceptTypes. Desactive esta opción especificando /Zc:noexceptTypes- para revertir al comportamiento de C++14 de noexcept cuando /std:c++17 o versiones posteriores se especifica.

A partir de la versión 15.5 de Visual Studio 2017, el compilador de C++ diagnostica más especificaciones de excepción no coincidentes en declaraciones en modo C++17 o al especificar la opción /permissive-.

En este ejemplo se muestra cómo se comportan las declaraciones con un especificador de excepciones cuando se establece o deshabilita la opción /Zc:noexceptTypes. Para mostrar el comportamiento cuando está establecida, realice la compilación con cl /EHsc /W4 noexceptTypes.cpp. Para mostrar el comportamiento cuando está deshabilitada, realice la compilación con cl /EHsc /W4 /Zc:noexceptTypes- noexceptTypes.cpp.

// noexceptTypes.cpp
// Compile by using: cl /EHsc /W4 noexceptTypes.cpp
// Compile by using: cl /EHsc /W4 /Zc:noexceptTypes- noexceptTypes.cpp

void f() throw();    // equivalent to void f() noexcept;
void f() { }         // warning C5043
void g() throw(...); // warning C5040

struct A
{
    virtual void f() throw();
};

struct B : A
{
    virtual void f() { } // error C2694
};

Cuando se compila con la opción predeterminada /Zc:noexceptTypes, el ejemplo genera este resultado: Para actualizar el código, use lo siguiente en su lugar:

void f() noexcept;
void f() noexcept { }
void g() noexcept(false);

struct A
{
    virtual void f() noexcept;
};

struct B : A
{
    virtual void f() noexcept { }
};

Para obtener más información sobre los problemas de conformidad de Visual C++, vea Nonstandard Behavior.

Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio

  1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para más información, vea Establecimiento del compilador de C++ y de propiedades de compilación en Visual Studio.

  2. Seleccione la página de propiedades Propiedades de configuración>C/C++>Línea de comandos.

  3. Modifique la propiedad Opciones adicionales para que incluya /Zc:noexceptTypes o /Zc:noexceptTypes- y, después, seleccione Aceptar.

Consulte también

/Zc (Conformidad)
noexcept
Especificaciones de excepción (throw)