編譯器錯誤 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");
}
}