コンパイラの警告 (レベル 1) C4297

'function': 例外をスローしないはずだがそれをする関数。

関数宣言には、(場合によっては暗黙的な) noexcept 指定子、空の throw 例外指定子、または __declspec(nothrow) 属性が含まれ、定義には、1 つ以上のスロー ステートメントが含まれています。 C4297 を解決するには、__declspec(nothrow)noexcept(true)、または throw() を使用して宣言した関数で例外をスローしようとしないでください。 または、noexceptthrow()__declspec(nothrow) の指定を削除します。

既定では、コンパイラは、ユーザー定義のデストラクターとデアロケーターの関数およびコンパイラによって生成される特殊なメンバー関数用に、暗黙的な noexcept(true) 指定子を生成します。 これは、ISO C++11 標準に準拠します。 暗黙的な noexcept 指定子の生成を回避し、コンパイラを Visual Studio 2013 の非標準の動作に戻すには、/Zc:implicitNoexcept- コンパイラ オプションを使用します。 詳細については、「/Zc:implicitNoexcept (暗黙の例外指定子)」を参照してください。

例外の仕様の詳細については、「例外の仕様 (スロー)」を参照してください。 また、コンパイル時の例外処理動作を変更する方法については、「/EH (例外処理モデル)」も参照してください。

この警告は、extern "C" とマークされている __declspec(dllexport) 関数の場合も、C++ 関数であったとしても生成されます。

次の例では C4297 が生成されます。

// C4297.cpp
// compile with: /W1 /LD
void __declspec(nothrow) f1()   // declared nothrow
// try the following line instead
// void f1()
{
   throw 1;   // C4297
}