/Zc:noexceptTypes
(C++17 noexcept 规则)
C++17 标准使 throw()
成为 noexcept
的别名、删除 throw(
type-list
)
和 throw(...)
并允许某些类型包含 noexcept
。 此更改可能导致符合 C++14 或更低标准的代码出现大量源兼容性问题。 /Zc:noexceptTypes
选项指定了与 C++17 标准的一致性。 /Zc:noexceptTypes-
使 C++17 模式下编译的代码兼容 C++14 和更低模式的行为。
语法
]$
注解
指定 /Zc:noexceptTypes
选项后,编译器符合 C++17 标准,且将 throw()
视为 noexcept
的别名、删除 throw(
type-list
)
和 throw(...)
并允许某些类型包含 noexcept
。 /Zc:noexceptTypes
选项仅在启用 /std:c++17
或更高版本时才可用。 默认启用 /Zc:noexceptTypes
以符合 ISO C++17 及更高标准。 /permissive-
选项不影响 /Zc:noexceptTypes
。 通过指定 /Zc:noexceptTypes-
关闭此选项,以在指定 /std:c++17
或更高版本时还原为 noexcept
的 C++14 行为。
从 Visual Studio 2017 版本 15.5 开始,C++ 编译器在 C++17 模式下或指定 /permissive-
选项时可诊断声明中更多不匹配的异常规范。
此示例演示在设置或禁用 /Zc:noexceptTypes
选项时具有异常说明符的声明的行为方式。 若要显示设置该选项时声明的行为,请通过使用 cl /EHsc /W4 noexceptTypes.cpp
进行编译。 若要显示禁用该选项时声明的行为,请通过使用 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
};
通过使用 /Zc:noexceptTypes
默认设置进行编译时,该示例生成所列警告。 若要更新代码,请改用以下内容:
void f() noexcept;
void f() noexcept { }
void g() noexcept(false);
struct A
{
virtual void f() noexcept;
};
struct B : A
{
virtual void f() noexcept { }
};
有关 Visual C++ 中一致性问题的详细信息,请参阅 Nonstandard Behavior。
在 Visual Studio 开发环境中设置此编译器选项
打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
选择“配置属性”>“C/C++”>“命令行”属性页。
修改“附加选项”属性以包含
/Zc:noexceptTypes
或/Zc:noexceptTypes-
,然后选择“确定”。