/Zc:noexceptTypes
(C++17 noexcept-Regeln)
Der C++17-Standard erstellt throw()
einen Alias für noexcept
, entfernt throw(
)
type-list
und throw(...)
, und ermöglicht die Aufnahme noexcept
bestimmter 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ßennoexcept
throw(
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 Verhalten von noexcept
C++14 wiederhergestellt werden soll, 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.cpp
von . 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:noexceptTypes
generiert 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
Ö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).
Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.
Ä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)