Поделиться через


Предупреждение компилятора (уровень 4) C4843

"type1": обработчик исключений ссылки на массив или тип функции недоступен, вместо этого используйте "type2"

Замечания

Обработчики ссылок на тип массива или функции никогда не соответствуют никаким объектам исключений. Начиная с Visual Studio 2017 версии 15.5 компилятор учитывает это правило и вызывает предупреждение уровня 4. Он также больше не соответствует обработчику char* или wchar_t* в строковом литерале, если используется /Zc:strictStrings.

Это предупреждение новое в Visual Studio 2017 версии 15.5. Сведения об отключении предупреждений по версии компилятора см. в предупреждениях компилятора по версии компилятора.

Пример

В этом примере показаны несколько catch операторов, вызывающих C4843:

// 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]) {}
}