/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 には影響しません。 /std:c++17 以降が指定されたときは、/Zc:noexceptTypes- を指定して 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- を含め、[OK] を選択します。

関連項目

/Zc (準拠)
noexcept
例外仕様 (スロー)