首頁 >後端開發 >C++ >為什麼 Visual Studio 2015 在編譯移動建構子程式碼時會報告錯誤 C2280「已刪除複製建構子」?

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

Susan Sarandon
Susan Sarandon原創
2024-10-27 20:01:02349瀏覽

Why Does Visual Studio 2015 Report Error C2280

Visual Studio 2015 報告C2280:探索「已刪除的複製建構子」問題

在Visual Studio 2013 中,編譯以下程式碼執行時沒有錯誤:

<code class="cpp">class A {
public:
   A(){}
   A(A &&{}){};
};

int main(int, char*) {
   A a;
   new A(a);
   return 0;
}</code>

但是,在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 標準,如果類別定義聲明了移動建構函式或移動賦值運算符,則編譯器會隱式產生刪除的複製建構函式和複製賦值運算符。這是提供的程式碼片段中的情況,其中存在移動構造函數。

解決問題
<code class="cpp">class A {
public:
   A(){}
   A(A &&{}){};
   A(const A&{}) = default;
};</code>

要解決編譯錯誤,需要明確聲明副本構造函數和複製賦值運算子預設是必需的:

透過此修改,編譯器將產生所需的複製建構函式和複製賦值運算符,而不將它們標記為已刪除。

其他注意事項如果類別定義了移動語義,通常建議也定義移動賦值運算子和析構函數。遵循「五法則」原則有助於確保適當的資源管理。

以上是為什麼 Visual Studio 2015 在編譯移動建構子程式碼時會報告錯誤 C2280「已刪除複製建構子」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn