/Zc:noexceptTypes
(C++17 noexcept rules)
The C++17 standard makes throw()
an alias for noexcept
, removes throw(
type-list
)
and throw(...)
, and allows certain types to include noexcept
. This change can cause a number of source compatibility issues in code that conforms to C++14 or earlier. The /Zc:noexceptTypes
option specifies conformance to the C++17 standard. /Zc:noexceptTypes-
allows the C++14 and earlier behavior when code is compiled in C++17 mode.
Syntax
/Zc:noexceptTypes
[-
]
Remarks
When the /Zc:noexceptTypes
option is specified, the compiler conforms to the C++17 standard and treats throw()
as an alias for noexcept
, removes throw(
type-list
)
and throw(...)
, and allows certain types to include noexcept
. The /Zc:noexceptTypes
option is only available when /std:c++17
or later is enabled. /Zc:noexceptTypes
is enabled by default to conform to the ISO C++17 and later standards. The /permissive-
option doesn't affect /Zc:noexceptTypes
. Turn off this option by specifying /Zc:noexceptTypes-
to revert to the C++14 behavior of noexcept
when /std:c++17
or later is specified.
Beginning in Visual Studio 2017 version 15.5, the C++ compiler diagnoses more mismatched exception specifications in declarations in C++17 mode, or when you specify the /permissive-
option.
This sample shows how declarations with an exception specifier behave when the /Zc:noexceptTypes
option is set or disabled. To show the behavior when set, compile by using cl /EHsc /W4 noexceptTypes.cpp
. To show the behavior when disabled, compile by using 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
};
When compiled by using the default setting /Zc:noexceptTypes
, the sample generates the listed warnings. To update your code, use the following instead:
void f() noexcept;
void f() noexcept { }
void g() noexcept(false);
struct A
{
virtual void f() noexcept;
};
struct B : A
{
virtual void f() noexcept { }
};
For more information about conformance issues in Visual C++, see Nonstandard Behavior.
To set this compiler option in the Visual Studio development environment
Open the project's Property Pages dialog box. For details, see Set C++ compiler and build properties in Visual Studio.
Select the Configuration Properties > C/C++ > Command Line property page.
Modify the Additional Options property to include
/Zc:noexceptTypes
or/Zc:noexceptTypes-
and then choose OK.