コンパイラ警告 (レベル 4) C4843

'type1: 配列または関数の型に対する参照の例外ハンドラーに到達できません。代わりに 'type2' を使用してください

解説

配列または関数型への参照のハンドラーは、どの例外オブジェクトとも一致することはできません。 2017 Visual Studio 15.5 より、コンパイラはこの規則を受け入れ、レベル 4 の警告を生成します。 /Zc:strictStrings を使用するときに char* または wchar_t* のハンドラーを文字列リテラルと一致させることもできなくなりました。

この警告は Visual Studio 2017 バージョン 15.5 で新たに追加されたものです。 コンパイラのバージョン別の警告を無効にする方法は、「コンパイラのバージョン別のコンパイラの警告」を参照してください。

このサンプルでは、C4843 の原因となるいくつかの catch ステートメントを示します。

// C4843_warning.cpp
// compile by using: cl /EHsc /W4 C4843_warning.cpp
int main()
{
    try {
        throw "";
    }
    catch (int (&)[1]) {} // C4843 (This should always be dead code.)
    catch (void (&)()) {} // C4843 (This should always be dead code.)
    catch (char*) {} // This should not be a match under /Zc:strictStrings
}

コンパイラは次の警告を生成します:

warning C4843: 'int (&)[1]': An exception handler of reference to array or function type is unreachable, use 'int*' instead
warning C4843: 'void (__cdecl &)(void)': An exception handler of reference to array or function type is unreachable, use 'void (__cdecl*)(void)' instead

次のコードでは、エラーが回避されます。

// C4843_fixed.cpp
// compile by using: cl /EHsc /W4 C4843_fixed.cpp
int main()
{
    try {
        throw "";
    }
    catch (int (*)[1]) {}
}