Partilhar via


Erro do compilador C2316

«class_type» : não pode ser apanhado, uma vez que o destruidor e/ou o construtor da cópia estão inacessíveis ou são eliminados

Observações

Uma exceção foi capturada por valor ou por referência, mas o construtor copy, o operador de atribuição ou ambos estavam inacessíveis.

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 MFC derivadas de CException. Como CException tem um construtor de cópia privada herdado, a classe e seus derivados não são copiáveis 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 MFC por valor anteriormente levaram a exceções não capturadas em tempo de execução. Agora o compilador identifica corretamente essa situação e relata o erro C2316. Para corrigir esse problema, recomendamos que você use as macros MFC TRY/CATCH em vez de escrever seus próprios manipuladores de exceção. Se isso não for apropriado para o seu código, pegue exceções MFC por referência.

Example

O exemplo a seguir gera 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");
    }
}