Visual Studio 2013 menyusun kod berikut tanpa ralat:
<code class="cpp">class A { public: A(){} A(A &&){} }; int main(int, char*) { A a; new A(a); return 0; }</code>
Walau bagaimanapun, Visual Studio 2015 RC menghadapi ralat 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
Dalam C 11, jika definisi kelas tidak mengisytiharkan secara eksplisit pembina salinan, pengkompil secara tersirat menghasilkan satu. Walau bagaimanapun, jika kelas mentakrifkan pembina alih atau pengendali tugasan pindah tanpa menyediakan juga pembina salinan eksplisit, pembina salinan tersirat ditakrifkan sebagai =delete. Ini adalah untuk menguatkuasakan Peraturan Lima, yang menghalang penghirisan tidak disengajakan apabila menyalin objek antara kelas asas dan terbitan yang berbeza.
Untuk menyelesaikan ralat C2280, anda mesti mengisytiharkan pembina salinan secara eksplisit jika anda mahu kelas boleh disalin. Berikut ialah dua pilihan:
Tentukan dan padamkan pembina salinan secara eksplisit:
<code class="cpp">class A { public: explicit A(){} A(A &&){} A(const A&) = delete; };</code>
Secara eksplisit sediakan dan lalai pembina salinan:
<code class="cpp">class A { public: explicit A(){} A(A &&){} A(const A&) = default; A& operator=(const A&) = default; };</code>
Dalam pendekatan kedua, anda juga perlu menyediakan operator penugasan pindah secara jelas dan pertimbangkan untuk mengisytiharkan pemusnah untuk mengikut Peraturan daripada Lima.
Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat Pengkompil C2280: \'Percubaan untuk Merujuk Fungsi Dipadam\' dalam Visual Studio?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!