首頁  >  文章  >  後端開發  >  為什麼我在 Visual Studio 中收到編譯器錯誤 C2280:「嘗試引用已刪除的函數」?

為什麼我在 Visual Studio 中收到編譯器錯誤 C2280:「嘗試引用已刪除的函數」?

Linda Hamilton
Linda Hamilton原創
2024-10-27 10:31:03397瀏覽

Why Am I Getting Compiler Error C2280:

編譯器錯誤C2280:在Visual Studio 中解決「嘗試引用已刪除的函數」

問題

Visual Studio 2013 編譯以下程式碼片段沒有錯誤:

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

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 &amp;)': attempting to reference a deleted function
1>  c:\dev\foo\foo.cpp(6): note: compiler has generated 'A::A' here

原因

在C 11 中,如果類別定義沒有明確聲明複製建構函數,編譯器隱式產生一個。但是,如果類別定義了移動建構函數或移動賦值運算符,但沒有同時提供明確複製建構函數,則隱式複製建構函數將定義為 =delete。這是為了強制執行“五規則”,防止在不同基底類別和衍生類別之間複製物件時出現無意的切片。

解決方案

要解決 C2280 錯誤,您必須明確聲明複製建構函數,如果你希望該類別是可複製的。這裡有兩個選項:

  1. 明確定義並刪除複製建構子

    <code class="cpp">class A {
    public:
       explicit A(){}
       A(A &amp;&amp;){}
       A(const A&amp;) = delete;
    };</code>
  2. 明確提供並預設複製建構子

    <code class="cpp">class A {
    public:
       explicit A(){}
       A(A &amp;&amp;){}
       A(const A&amp;) = default;
       A&amp; operator=(const A&amp;) = default;
    };</code>

在第二種方法中,您還需要明確提供移動賦值運算符,並考慮聲明析構函數以遵循規則五個。

以上是為什麼我在 Visual Studio 中收到編譯器錯誤 C2280:「嘗試引用已刪除的函數」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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