Compartilhar via


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");
    }
}