」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼 Visual Studio 2015 在編譯移動建構子程式碼時會報告錯誤 C2280「已刪除複製建構子」?

為什麼 Visual Studio 2015 在編譯移動建構子程式碼時會報告錯誤 C2280「已刪除複製建構子」?

發佈於2024-11-17
瀏覽:526

Why Does Visual Studio 2015 Report Error C2280 \

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