Kompilatorfel C2316

"class_type" : kan inte fångas eftersom destruktorn och/eller kopieringskonstruktorn inte är tillgänglig eller tas bort

Anmärkningar

Ett undantag fångades av värde eller referens, men kopieringskonstruktorn, tilldelningsoperatorn eller båda var otillgängliga.

Överensstämmelseändringar i Visual Studio 2015 gjorde att det här felet gällde felaktiga catch-instruktioner för MFC-undantag som härletts från CException. Eftersom CException har en ärvd privat kopieringskonstruktor är klassen och dess derivat inte kopierbara och kan inte skickas med värde, vilket också innebär att de inte kan fångas av värdet. Catch-instruktioner som fångade MFC-undantag efter värde ledde tidigare till ohanterade undantag vid körning. Nu identifierar kompilatorn den här situationen korrekt och rapporterar felet C2316. För att åtgärda det här problemet rekommenderar vi att du använder MFC TRY/CATCH-makron i stället för att skriva egna undantagshanterare. Om det inte är lämpligt för din kod kan du fånga MFC-undantag med referens i stället.

Example

Följande exempel genererar C2316 och visar ett sätt att åtgärda det:

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