首頁  >  文章  >  後端開發  >  為什麼在編譯可在 Visual Studio 2013 中執行的程式碼時,Visual Studio 2015 會拋出錯誤 C2280「嘗試引用已刪除的函數」?

為什麼在編譯可在 Visual Studio 2013 中執行的程式碼時,Visual Studio 2015 會拋出錯誤 C2280「嘗試引用已刪除的函數」?

Barbara Streisand
Barbara Streisand原創
2024-10-27 04:00:29793瀏覽

Why Does Visual Studio 2015 Throw Error C2280

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

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