Erro do compilador C2316
'class_type': não pode ser detectado porque o destruidor e/ou o construtor de cópia estão inacessíveis ou foram excluídos
Uma exceção foi capturada por valor ou por referência, mas o construtor de cópia, o operador de atribuição ou ambos estavam inacessíveis.
Comentários
As alterações de conformidade no Visual Studio 2015 fizeram com que esse erro se aplicasse a instruções de captura incorretas de exceções do MFC derivadas de CException
. Como CException
tem um construtor de cópia privada herdado, a classe e os derivados dela não são copiados e não podem ser passados pelo valor, o que também significa que eles não podem ser capturados pelo valor. Instruções catch que capturaram exceções do MFC por valor anteriormente levaram a exceções não capturadas em runtime. Agora, o compilador identifica corretamente essa situação e relata o erro C2316. Para corrigir esse problema, recomendamos que você use as macros TRY/CATCH do MFC em vez de escrever manipuladores de exceção próprios. Se isso não for apropriado para o código, capture exceções do MFC por referência.
Exemplo
O exemplo a seguir gera o erro C2316 e mostra uma maneira de corrigi-lo:
// 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");
}
}