Condividi tramite


Errore del compilatore C2316

'class_type': impossibile intercettato come distruttore e/o costruttore di copia non accessibile o eliminato

Osservazioni:

È stata rilevata un'eccezione per valore o per riferimento, ma il costruttore di copia, l'operatore di assegnazione o entrambi non sono accessibili.

Le modifiche di conformità in Visual Studio 2015 hanno reso questo errore applicabile alle istruzioni catch non valide delle eccezioni MFC derivate da CException. Poiché CException ha un costruttore di copia privata ereditato, la classe e i suoi derivati non sono copiabili e non possono essere passati per valore, il che significa anche che non possono essere intercettati per valore. Le istruzioni Catch che hanno rilevato eccezioni MFC per valore in precedenza hanno causato eccezioni non rilevate in fase di esecuzione. Ora il compilatore identifica correttamente questa situazione e segnala l'errore C2316. Per risolvere questo problema, è consigliabile usare le macro TRY/CATCH MFC anziché scrivere gestori di eccezioni personalizzati. Se non è appropriato per il codice, intercettare invece le eccezioni MFC per riferimento.

Esempio

L'esempio seguente genera l'errore C2316 e mostra un modo per correggerlo:

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