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中文網其他相關文章!