Condividi tramite


/Zc:noexceptTypes (Regole noexcept C++17)

Lo standard C++17 crea throw() un alias per noexcept, rimuove throw()type-liste throw(...)e consente a determinati tipi di includere .noexcept Questa modifica può causare diversi problemi di compatibilità di origine nel codice conforme a C++14 o versioni precedenti. L'opzione /Zc:noexceptTypes specifica la conformità allo standard C++17. /Zc:noexceptTypes- consente il comportamento C++14 e versioni precedenti quando il codice viene compilato in modalità C++17.

Sintassi

/Zc:noexceptTypes[-]

Osservazioni:

Quando si specifica l'opzione /Zc:noexceptTypes , il compilatore è conforme allo standard C++17 e considera throw() come alias per noexcept, rimuove throw()type-liste throw(...)e consente a determinati tipi di includere .noexcept L'opzione /Zc:noexceptTypes è disponibile solo quando /std:c++17 o versione successiva è abilitata. /Zc:noexceptTypes è abilitato per impostazione predefinita per la conformità agli standard ISO C++17 e versioni successive. L'opzione /permissive- non influisce su /Zc:noexceptTypes. Disattiva questa opzione specificando di /Zc:noexceptTypes- ripristinare il comportamento C++14 di noexcept quando /std:c++17 o versioni successive è specificato.

A partire da Visual Studio 2017 versione 15.5, il compilatore C++ diagnostica più specifiche di eccezioni non corrispondenti nelle dichiarazioni in modalità C++17 o quando si specifica l'opzione /permissive- .

Questo esempio illustra il comportamento delle dichiarazioni con un identificatore di eccezione quando l'opzione /Zc:noexceptTypes è impostata o disabilitata. Per visualizzare il comportamento quando impostato, compilare usando cl /EHsc /W4 noexceptTypes.cpp. Per visualizzare il comportamento quando disabilitato, compilare usando 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
};

Quando viene compilato usando l'impostazione /Zc:noexceptTypespredefinita , l'esempio genera gli avvisi elencati. Per aggiornare il codice, usare invece quanto segue:

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

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

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

Per altre informazioni sui problemi di conformità in Visual C++, vedere Nonstandard Behavior.

Per impostare l'opzione del compilatore nell'ambiente di sviluppo di Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.

  2. Selezionare la pagina delle proprietà Proprietà di configurazione>C/C++>Riga di comando.

  3. Modificare la proprietà Opzioni aggiuntive per includere /Zc:noexceptTypes o /Zc:noexceptTypes- quindi scegliere OK.

Vedi anche

/Zc (Conformità)
noexcept
Specifiche di eccezione (throw)