/Zc:noexceptTypes (C++17 noexcept-Regeln)

Der C++17-Standard erstellt throw() einen Alias für noexcept, entfernt throw()type-listund throw(...), und ermöglicht die Aufnahme noexceptbestimmter Typen . Diese Änderung kann zu einer Reihe von Quellkompatibilitätsproblemen im Code führen, der C++14 oder einer früheren Version entspricht. Die /Zc:noexceptTypes Option gibt die Konformität mit dem C++17-Standard an. /Zc:noexceptTypes- ermöglicht das Verhalten von C++14 und früheren Versionen, wenn Code im C++17-Modus kompiliert wird.

Syntax

/Zc:noexceptTypes[-]

Hinweise

Wenn die /Zc:noexceptTypes Option angegeben wird, entspricht der Compiler dem C++17-Standard und behandelt throw() als Alias für noexcept, entfernt und entfernt und throw(...)ermöglicht es bestimmten Typen, einzuschließennoexceptthrow(type-list). Die /Zc:noexceptTypes Option ist nur verfügbar, wenn /std:c++17 oder höher aktiviert ist. /Zc:noexceptTypes ist standardmäßig aktiviert, um den ISO C++17- und höher-Standards zu entsprechen. Die /permissive- Option wirkt sich nicht auf /Zc:noexceptTypes. Deaktivieren Sie diese Option, indem Sie angeben/Zc:noexceptTypes-, dass das C++14-Verhalten noexcept rückgängig machen, wenn /std:c++17 oder höher angegeben wird.

Ab Visual Studio 2017, Version 15.5, diagnostiziert der C++-Compiler mehr übereinstimmende Ausnahmespezifikationen in Deklarationen im C++17-Modus oder wenn Sie die /permissive- Option angeben.

In diesem Beispiel wird gezeigt, wie sich Deklarationen mit einem Ausnahmebezeichner verhalten, wenn die /Zc:noexceptTypes Option festgelegt oder deaktiviert wird. Um das Verhalten beim Festlegen anzuzeigen, kompilieren Sie mithilfe cl /EHsc /W4 noexceptTypes.cppvon . Um das Verhalten beim Deaktivieren anzuzeigen, kompilieren Sie es mithilfe von 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
};

Bei der Kompilierung mithilfe der Standardeinstellung /Zc:noexceptTypesgeneriert das Beispiel die aufgelisteten Warnungen. Verwenden Sie zum Aktualisieren des Codes stattdessen Folgendes:

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

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

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

Weitere Informationen über Konformitätsprobleme in Visual C++ finden Sie unter Nonstandard Behavior.

So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).

  2. Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.

  3. Ändern Sie die Eigenschaft "Zusätzliche Optionen", um sie einzuschließen /Zc:noexceptTypes oder /Zc:noexceptTypes- auszuwählen, und wählen Sie dann "OK" aus.

Siehe auch

/Zc (Konformität)
noexcept
Ausnahmespezifikationen (Auslösen)