Bagikan melalui


Peringatan kompilator (tingkat 4) C5267

definisi operator konstruktor/penugasan salinan implisit untuk 'jenis' tidak digunakan lagi karena memiliki operator penugasan/konstruktor salin yang disediakan pengguna

Keterangan

C++ Standard tidak digunakan lagi (tetapi tidak menghapus) pembuatan implisit operator salinan dan penugasan dalam beberapa kondisi. Pengkompilasi MSVC masih menghasilkan operator salinan dan penugasan dalam kondisi tersebut, tetapi dapat mengubah perilakunya di masa mendatang jika standar menghapus perilaku yang tidak digunakan lagi. Tujuan dari peringatan ini adalah untuk membantu membuktikan kode Anda di masa mendatang jika komite memutuskan untuk menghapus fungsionalitas ini.

Bagian yang relevan dalam standar C++ adalah:

  • class.copy.ctor paragraf 6, yang mengatakan: "Jika definisi kelas tidak secara eksplisit mendeklarasikan konstruktor salinan, yang tidak ada dinyatakan secara implisit. Jika definisi kelas mendeklarasikan konstruktor pemindahan atau operator penetapan pemindahan, konstruktor salinan yang dinyatakan secara implisit didefinisikan sebagai dihapus; jika tidak, itu default. Kasus terakhir tidak digunakan lagi jika kelas memiliki operator penetapan salinan yang dideklarasikan pengguna atau destruktor yang dideklarasikan pengguna."
  • Lampiran D.8, yang mengatakan: "Definisi implisit dari konstruktor salinan sebagai default tidak digunakan lagi jika kelas memiliki operator penetapan salinan yang dideklarasikan pengguna atau destruktor yang dinyatakan pengguna. Definisi implisit dari operator penugasan salinan sebagai default tidak digunakan lagi jika kelas memiliki konstruktor salinan yang dideklarasikan pengguna atau destruktor yang dideklarasikan pengguna. Ada kemungkinan bahwa versi C++ di masa mendatang akan menentukan bahwa definisi implisit ini dihapus."

Contoh

Kode berikut menunjukkan peringatan C5267 ketika fungsi khusus yang dihasilkan secara implisit dipanggil tetapi tidak didefinisikan secara eksplisit. Keduanya /W4 dan /w45267 diharuskan untuk menghasilkan peringatan ini.

// C5267.cpp
// compile using: /W4 /w45267
struct CopyCtorOnly
{
    CopyCtorOnly() = default;
    CopyCtorOnly(const CopyCtorOnly&) {} // C5267
};

struct CopyAssignOpOnly
{
    CopyAssignOpOnly() = default;
    CopyAssignOpOnly& operator=(const CopyAssignOpOnly&) // C5267
    {
        return *this;
    }
};

int main()
{
    CopyCtorOnly a1, a2;
    a1 = a2; // Calls deprecated copy assignment operator

    CopyAssignOpOnly b1;
    CopyAssignOpOnly b2 = b1; // Calls deprecated copy constructor
}

Untuk mengatasi masalah ini, tentukan konstruktor salinan atau operator penugasan salinan yang hilang secara eksplisit.

Baca juga

Fungsi Default dan Dihapus Secara Eksplisit