Visual Studio 2015 報告C2280:探索「刪除的複製建構子」問題
在Visual Studio 2013 中,編譯以下程式碼執行時沒有錯誤:
class A {
public:
A(){}
A(A &&{}){};
};
int main(int, char*) {
A a;
new A(a);
return 0;
}
然而,在Visual Studio 2015 RC 中編譯時,編譯器會引發錯誤C2280:
1> c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)' : attempting to reference a deleted function
錯誤背後的原因
Visual Studio 2015 的行為與其前身不同。根據 C 標準,如果類別定義聲明了移動建構函式或移動賦值運算符,則編譯器會隱式產生刪除的複製建構函式和複製賦值運算符。所提供的程式碼片段就是這種情況,其中存在移動構造函數。
解決問題
要解決編譯錯誤,需要明確宣告副本建構子和複製賦值運算子預設是必要的:
class A {
public:
A(){}
A(A &&{}){};
A(const A&{}) = default;
};
透過此修改,編譯器將產生所需的複製建構子和複製賦值運算符,而不將它們標記為已刪除。
其他注意事項
如果類別定義了移動語義,通常建議也定義移動賦值運算子和析構函數。遵循「五規則」原則有助於確保適當的資源管理。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3