コンパイラの警告 (レベル 1) C4297
'function': 例外をスローしないはずだがそれをする関数。
関数宣言には、(場合によっては暗黙的な) noexcept
指定子、空の throw
例外指定子、または __declspec(nothrow) 属性が含まれ、定義には、1 つ以上のスロー ステートメントが含まれています。 C4297 を解決するには、__declspec(nothrow)
、noexcept(true)
、または throw()
を使用して宣言した関数で例外をスローしようとしないでください。 または、noexcept
、throw()
、__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
}