Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Visual Studio 2015 Membuang Ralat C2280 \"percubaan untuk merujuk fungsi yang dipadam\" Apabila Mengumpul Kod yang Berfungsi dalam Visual Studio 2013?

Mengapa Visual Studio 2015 Membuang Ralat C2280 \"percubaan untuk merujuk fungsi yang dipadam\" Apabila Mengumpul Kod yang Berfungsi dalam Visual Studio 2013?

Barbara Streisand
Barbara Streisandasal
2024-10-27 04:00:29793semak imbas

Why Does Visual Studio 2015 Throw Error C2280

C Compiler Error C2280 "cuba untuk merujuk fungsi yang dipadam" dalam Visual Studio 2013 dan 2015

C compiler dalam Microsoft Visual Studio 2013 dan 2015 mengendalikan pembina salinan dan pengendali tugasan secara berbeza.

Visual Studio 2013

Jika pembina salinan atau operator tugasan alih tidak diisytiharkan secara eksplisit dalam definisi kelas, pengkompil akan menjananya secara tersirat.

Visual Studio 2015

Walau bagaimanapun, dalam Visual Studio 2015, jika definisi kelas termasuk pembina alih atau pengendali tugasan pindah, salinan yang diisytiharkan secara tersirat pembina ditakrifkan sebagai dipadam.

Pernyataan Masalah

Kod berikut berjaya menyusun dalam Visual Studio 2013 tetapi menjana ralat C2280 dalam Visual Studio 2015:

<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 &)' cuba merujuk fungsi yang dipadamkan

Resolusi

Untuk membetulkannya ralat dalam Visual Studio 2015, seseorang perlu mengisytiharkan pembina salinan dan memindahkan pengendali tugasan secara eksplisit, atau menggunakan pembina lalai:

Pilihan 1: Mengisytiharkan Pembina Salin dan Pindahkan Operator Tugasan Secara Eksplisit

<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>

Pilihan 2: Tentukan Kelas sebagai Dipadam atau Tidak Lengkap

<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>

Atas ialah kandungan terperinci Mengapa Visual Studio 2015 Membuang Ralat C2280 \"percubaan untuk merujuk fungsi yang dipadam\" Apabila Mengumpul Kod yang Berfungsi dalam Visual Studio 2013?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn