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-,然后选择“确定”。