/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 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。
[構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。
[追加オプション] プロパティを変更して
/Zc:noexceptTypes
または/Zc:noexceptTypes-
を含め、[OK] を選択します。