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


Ошибка компилятора C2316

"class_type": невозможно поймать как деструктор и /или конструктор копирования недоступны или удалены

Исключение было поймано по значению или по ссылке, но конструктор копирования, оператор назначения или оба были недоступны.

Замечания

Изменения соответствия в Visual Studio 2015 сделали эту ошибку применимо к недопустимым операторам catch исключений MFC, производных от CException. Поскольку CException имеет унаследованный конструктор частной копии, класс и его производные не копируются и не могут передаваться по значению, что также означает, что они не могут быть пойманы по значению. Операторы Catch, которые поймали исключения MFC по значению, ранее привели к неуловимым исключениям во время выполнения. Теперь компилятор правильно определяет эту ситуацию и сообщает об ошибке C2316. Чтобы устранить эту проблему, рекомендуется использовать макросы MFC TRY/CATCH, а не создавать собственные обработчики исключений. Если это не подходит для кода, перехватите исключения MFC по ссылке.

Пример

В следующем примере возникает ошибка C2316 и показан способ ее устранения:

// C2316.cpp
// compile with: /EHsc
#include <stdio.h>

struct B
{
public:
    B() {}
    // Delete the following line to resolve.
private:
    // copy constructor
    B(const B&) {}
};

void f(const B&)
{
}

int main()
{
    try
    {
        B aB;
        f(aB);
    }
    catch (B b)    // C2316
    {
        printf_s("Caught an exception!\n");
    }
}