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 1> c:\dev\foo\foo.cpp(6): note: compiler has generated 'A::A' here
在C 11 中,如果類別定義沒有明確聲明複製建構函數,編譯器隱式產生一個。但是,如果類別定義了移動建構函數或移動賦值運算符,但沒有同時提供明確複製建構函數,則隱式複製建構函數將定義為 =delete。這是為了強制執行“五規則”,防止在不同基底類別和衍生類別之間複製物件時出現無意的切片。
要解決 C2280 錯誤,您必須明確聲明複製建構函數,如果你希望該類別是可複製的。這裡有兩個選項:
明確定義並刪除複製建構子:
<code class="cpp">class A { public: explicit A(){} A(A &&){} A(const A&) = delete; };</code>
明確提供並預設複製建構子
:<code class="cpp">class A { public: explicit A(){} A(A &&){} A(const A&) = default; A& operator=(const A&) = default; };</code>
以上是為什麼我在 Visual Studio 中收到編譯器錯誤 C2280:「嘗試引用已刪除的函數」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!