编译器错误 C2316

“class_type”:无法作为析构函数捕获,或者复制构造函数不可访问或已删除,或同时出现这两种情况

通过值或引用捕获了异常,但复制构造函数、赋值运算符或两者皆无法访问。

注解

Visual Studio 2015 中的一致性更改使此错误应用到派生自 CException 的 MFC 异常的错误 catch 语句。 因为 CException 具有继承的专用复制构造函数,因此,类及其派生是不可复制的,并且不能按值进行传递,这也意味着它们不能通过值来捕获。 之前通过值捕获 MFC 异常的 catch 语句会在运行时导致未捕获的异常。 现在,编译器可以正确识别这种情况并报告错误 C2316。 若要解决此问题,建议使用 MFC TRY/CATCH 宏,而不是编写自己的异常处理程序。 如果这不适合你的代码,请改为通过引用捕获 MFC 异常。

示例

以下示例将生成 C2316 并显示了如何修复此错误:

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