C ++ 17 N4659 konsep standar
Untuk referensi standar lintas cepat, lihat bagian "Dideklarasikan secara implisit" dari entri preferensi cppreferensi berikut:
Informasi yang sama tentu saja dapat diperoleh dari standar. Misalnya pada C ++ 17 N4659 draft standar :
15.8.1 "Salin / pindahkan konstruktor" kata untuk konstruktor salin:
6 Jika definisi kelas tidak secara eksplisit mendeklarasikan konstruktor salinan, definisi non-eksplisit dinyatakan secara implisit. Jika definisi kelas menyatakan move constructor atau move assignment operator, copy constructor yang dideklarasikan secara implisit didefinisikan sebagai dihapus; jika tidak, itu didefinisikan sebagai default (11.4). Kasus terakhir tidak digunakan lagi jika kelas memiliki operator penugasan salinan yang dideklarasikan pengguna atau destruktor yang dideklarasikan pengguna.
dan untuk move constructor:
8 Jika definisi kelas X tidak secara eksplisit menyatakan move constructor, definisi non-eksplisit akan secara implisit dinyatakan sebagai default jika dan hanya jika
(8.1) - X tidak memiliki konstruktor salin yang dinyatakan pengguna,
(8.2) - X tidak memiliki operator penugasan salinan yang dinyatakan pengguna,
(8.3) - X tidak memiliki operator penugasan pindah yang dinyatakan pengguna, dan
(8.4) - X tidak memiliki destruktor yang dinyatakan pengguna.
15.8.2 "Operator salin / pindahkan tugas" mengatakan untuk tugas salin:
2 Jika definisi kelas tidak secara eksplisit menyatakan operator penugasan salinan, satu dinyatakan secara implisit. Jika definisi kelas menyatakan move constructor atau operator penugasan pindah, operator penugasan salinan yang dinyatakan secara implisit didefinisikan sebagai dihapus; jika tidak, itu didefinisikan sebagai default (11.4). Kasus yang terakhir tidak digunakan lagi jika kelas memiliki konstruktor salinan yang dideklarasikan pengguna atau destruktor yang dideklarasikan pengguna.
dan untuk pemindahan tugas:
4 Jika definisi kelas X tidak secara eksplisit mendeklarasikan operator penugasan pindah, seseorang akan secara implisit dinyatakan sebagai default jika dan hanya jika
- (4.1) - X tidak memiliki copy constructor yang dideklarasikan oleh pengguna,
- (4.2) - X tidak memiliki konstruktor pemindahan yang dideklarasikan oleh pengguna,
- (4.3) - X tidak memiliki operator penugasan salinan yang dinyatakan pengguna, dan
- (4.4) - X tidak memiliki destruktor yang dideklarasikan pengguna.
15.4 "Destructors" mengatakannya untuk destructor:
4 Jika sebuah kelas tidak memiliki destruktor yang dideklarasikan pengguna, sebuah destruktor secara implisit dinyatakan sebagai default (11.4). Destroyer yang dideklarasikan secara implisit adalah anggota publik inline dari kelasnya.