Compartir a través de


Error del compilador C2316

'tipo_de_clase': no se puede detectar porque el destructor y/o el constructor de copia están inaccesibles o se eliminaron

Se ha detectado una excepción por valor o por referencia, pero el constructor de copia, el operador de asignación o ambos estaban inaccesibles.

Comentarios

Los cambios realizados en Visual Studio 2015 por motivos de conformidad hicieron que se aplicara este error a instrucciones catch incorrectas de excepciones de MFC derivadas de CException. Dado que CException tiene un constructor de copia privado heredado, la clase y sus derivados no se pueden copiar y no se pueden pasar por valor, lo que también significa que no se pueden detectar por valor. Las instrucciones catch que detectaban excepciones de MFC por valor antes producían excepciones no detectadas en tiempo de ejecución. Ahora el compilador identifica correctamente esta situación y muestra el error C2316. Para corregir este problema, se recomienda usar las macros TRY/CATCH de MFC en lugar de escribir sus propios controladores de excepciones. Si esto no es válido para su código, detecte las excepciones de MFC por referencia.

Ejemplo

El ejemplo siguiente genera el error C2316, y muestra una manera de corregirlo:

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