Ошибка компилятора 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");
}
}