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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk