/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[-]

注解

指定 /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 开发环境中设置此编译器选项

  1. 打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性

  2. 选择“配置属性”>“C/C++”>“命令行”属性页

  3. 修改“附加选项”属性以包含 /Zc:noexceptTypes/Zc:noexceptTypes-,然后选择“确定”

另请参阅

/Zc(一致性)
noexcept
异常规范 (throw)