Visual Studio 2015 Reports C2280: Meneroka Isu "Deleted Copy Constructor"
Dalam Visual Studio 2013, menyusun kod berikut dilaksanakan 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, selepas penyusunan dalam Visual Studio 2015 RC, pengkompil menimbulkan ralat C2280:
1> c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)' : attempting to reference a deleted function
Punca Di Sebalik Ralat
Visual Studio 2015 berkelakuan berbeza daripada pendahulunya. Menurut piawaian C, jika definisi kelas mengisytiharkan pembina bergerak atau operator tugasan pindah, pengkompil secara tersirat menjana pembina salinan dan operator tugasan salinan sebagai dipadamkan. Ini adalah kes dalam coretan kod yang disediakan, di mana pembina bergerak hadir.
Mengatasi Masalah
Untuk menyelesaikan ralat penyusunan, pengisytiharan eksplisit salinan pembina dan operator tugasan salinan sebagai lalai adalah perlu:
<code class="cpp">class A { public: A(){} A(A &&{}){}; A(const A&{}) = default; };</code>
Dengan pengubahsuaian ini, pengkompil akan menjana pembina salinan yang diperlukan dan operator tugasan salinan tanpa menandakannya sebagai dipadamkan.
Pertimbangan Tambahan
Jika kelas mentakrifkan semantik pindah, secara amnya disyorkan untuk turut mentakrifkan pengendali tugasan pindah dan pemusnah. Mengikuti prinsip "Peraturan Lima" boleh membantu memastikan pengurusan sumber yang betul.
Atas ialah kandungan terperinci Mengapa Visual Studio 2015 Melaporkan Ralat C2280 \'Pembina Salinan Dipadam\' Semasa Mengumpul Kod Pembina Alih?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!