Visual Studio 2013 和2015 中的C 編譯器錯誤C2280「嘗試引用已刪除的函數」
VisualMicrosoft Studio 2013 中的C 編譯器和2015 對複製建構子和賦值運算子的處理方式不同。
Visual Studio 2013
如果未在類別定義中明確聲明複製建構子或移動賦值運算符,編譯器將隱式產生它們。
Visual Studio 2015
但是,在Visual Studio 2015 中,如果類別定義包含移動建構子或移動賦值運算子,則隱式宣告的副本建構函數被定義為已刪除。
問題陳述
以下程式碼在Visual Studio 2013 中編譯成功,但在Visual Studio 2015 產生錯誤C2280:
<code class="cpp">class A { public: A(){} A(A &&&) {} }; int main(int, char*) { A a; new A(a); return 0; }</code>
C2280: 'A::A(const A &)' 嘗試引用已刪除的函數
解
修正此問題Visual Studio 2015ual中出現錯誤,需要明確聲明複製建構子和移動賦值運算符,或使用預設建構子:
選項1:明確宣告複製建構子和移動賦值運算子
<code class="cpp">class A { public: A(){} A(A &&&) {} A(const A&) = default; // Default copy constructor A& operator=(const A&) = default; // Default move assignment operator };</code>
選項2:將類別定義為已刪除或不完整
<code class="cpp">class A { public: A(){} A(A &&&) = delete; // Mark copy constructor as deleted A(const A&); // Incomplete constructor (cannot be instantiated) A& operator=(const A&); // Incomplete assignment operator (cannot be instantiated) };</code>
以上是為什麼在編譯可在 Visual Studio 2013 中執行的程式碼時,Visual Studio 2015 會拋出錯誤 C2280「嘗試引用已刪除的函數」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!