编译器错误 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");
}
}