/Zc:noexceptTypes (C++17 noexcept rules)

C++17 標準會針對 、removes type-listthrow()throw(...) 建立 throw() 別名 noexcept ,並允許特定類型包含 。 noexcept 這項變更可能會導致符合 C++14 或更早版本之程式碼中的許多來源相容性問題。 選項 /Zc:noexceptTypes 會指定符合 C++17 標準。 /Zc:noexceptTypes- 當程式碼以 C++17 模式編譯時,允許 C++14 和更早的行為。

語法

/Zc:noexceptTypes[-]

備註

/Zc:noexceptTypes指定 選項時,編譯器符合 C++17 標準,並視為 throw() 、 移除 throw()type-listthrow(...) 的別名 noexcept ,並允許包含特定類型。 noexcept /Zc:noexceptTypes只有在或更新版本啟用時 /std:c++17 ,才能使用此選項。 /Zc:noexceptTypes 預設會啟用,以符合 ISO C++17 和更新版本標準。 選項 /permissive- 不會影響 /Zc:noexceptTypes 。 藉由指定 /Zc:noexceptTypes- 還原為指定或更新版本的 C++14 行為 noexcept/std:c++17 ,以關閉此選項。

從 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)