class my_class
{
...
my_class(my_class const &) = delete;
...
};
Apa = delete
artinya dalam konteks itu?
Apakah ada "pengubah" lain (selain = 0
dan = delete
)?
c++
function
c++11
declaration
delete-operator
Pat O'Keefe
sumber
sumber
#define
la Qt yang dievaluasi menjadi 0 dan kemudian menyatakan fungsi tersembunyi atau sesuatu.Jawaban:
Menghapus fungsi adalah fitur C ++ 11 :
sumber
=delete
membuat metode tidak dapat diakses bahkan dari konteks yang dapat melihatprivate
metode (yaitu di dalam kelas dan teman-temannya). Ini menghilangkan ketidakpastian ketika Anda membaca kode. @Prasoon, contoh kedua itu masih hanya menghapus konstruktor - alangkah baiknya melihat yang dihapusoperator long ()
misalnya.= delete
lebih baik daripada menggunakanprivate
atau mekanisme serupa lainnya karena biasanya Anda ingin fungsi terlarang dideklarasikan secara jelas dan dipertimbangkan untuk resolusi overload dll, sehingga dapat gagal sedini mungkin dan memberikan kesalahan paling jelas kepada pengguna. Solusi apa pun yang melibatkan "menyembunyikan" deklarasi mengurangi efek ini.= 0
berarti suatu fungsi adalah virtual murni dan Anda tidak dapat membuat instance objek dari kelas ini. Anda perlu mengambil darinya dan menerapkan metode ini= delete
berarti kompiler tidak akan menghasilkan konstruktor untuk Anda. AFAIK ini hanya diperbolehkan pada copy constructor dan operator penugasan. Tapi saya tidak terlalu bagus dalam standar yang akan datang.sumber
=delete
sintaks. Misalnya, Anda dapat menggunakannya untuk secara eksplisit melarang beberapa jenis konversi implisit yang mungkin terjadi dengan panggilan. Untuk ini, Anda cukup menghapus fungsi kelebihan beban. Lihat halaman Wikipedia di C ++ 0x untuk info lebih lanjut.= delete
tidak sepenuhnya benar.= delete
dapat digunakan untuk fungsi apa pun, dalam hal ini secara eksplisit ditandai sebagai dihapus dan setiap penggunaan menghasilkan kesalahan kompilator. Untuk fungsi anggota khusus, ini juga berarti secara khusus bahwa mereka tidak dihasilkan untuk Anda oleh kompiler, tetapi itu hanya hasil dari penghapusan, dan bukan apa yang= delete
sebenarnya.Kutipan dari Bahasa Pemrograman C ++ ini [Edisi ke-4] - Buku Bjarne Stroustrup berbicara tentang tujuan sebenarnya di balik penggunaan
=delete
:sumber
Karena tampaknya tidak ada orang yang menjawab pertanyaan ini, saya harus menyebutkan bahwa ada juga
=default
.https://docs.microsoft.com/en-us/cpp/cpp/explicitly-defaulted-and-deleted-functions#explicitly-defaulted-functions
sumber
Standar pengkodean yang telah saya kerjakan memiliki yang berikut untuk sebagian besar deklarasi kelas.
Jika Anda menggunakan salah satu dari 6 ini, Anda cukup mengomentari baris yang sesuai.
Contoh: kelas FizzBus hanya membutuhkan dtor, dan karenanya tidak menggunakan 5 lainnya.
Kami berkomentar hanya 1 di sini, dan menginstal pelaksanaannya di tempat lain (mungkin di mana standar pengkodean menyarankan). 5 lainnya (dari 6) tidak diizinkan menghapus.
Anda juga dapat menggunakan '= hapus' untuk melarang promosi tersirat dari berbagai nilai ukuran ... contoh
sumber
= delete
adalah fitur yang diperkenalkan di C ++ 11. Sesuai=delete
itu tidak akan diizinkan untuk memanggil fungsi itu.Secara terperinci.
Misalkan di kelas.
Saat memanggil fungsi ini untuk penugasan keberatan, itu tidak akan diizinkan. Berarti operator penugasan akan membatasi untuk menyalin dari satu objek ke objek lain.
sumber
Standar C ++ 0x baru. Silakan lihat bagian 8.4.3 dalam konsep kerja N3242
sumber
Fungsi yang dihapus secara implisit sebaris
(Tambahan untuk jawaban yang ada)
... Dan fungsi yang dihapus akan menjadi deklarasi pertama dari fungsi (kecuali untuk menghapus spesialisasi eksplisit dari templat fungsi - penghapusan harus pada deklarasi pertama spesialisasi), yang berarti Anda tidak dapat mendeklarasikan fungsi dan kemudian menghapusnya, katakanlah, pada definisi lokal ke unit terjemahan.
Mengutip [dcl.fct.def.delete] / 4 :
Templat fungsi utama dengan definisi yang dihapus dapat dikhususkan
Meskipun aturan umum adalah untuk menghindari templat fungsi khusus karena spesialisasi tidak berpartisipasi dalam langkah pertama resolusi kelebihan beban, ada beberapa konteks yang dapat diperdebatkan. Misalnya ketika menggunakan templat fungsi utama yang tidak kelebihan beban tanpa definisi untuk mencocokkan semua jenis yang tidak ingin orang dikonversi secara implisit ke kelebihan beban yang sesuai dengan konversi; yaitu, untuk secara implisit menghapus sejumlah kecocokan konversi-konversi dengan hanya menerapkan kecocokan jenis yang tepat dalam spesialisasi eksplisit dari templat fungsi primer yang tidak didefinisikan, tidak kelebihan beban.
Sebelum konsep fungsi C ++ 11 yang dihapus, orang bisa melakukan ini hanya dengan menghilangkan definisi templat fungsi utama, tetapi ini memberikan kesalahan referensi yang tidak terdefinisi yang tidak jelas yang tidak memberikan maksud semantik sama sekali dari pembuat templat fungsi primer (sengaja dihilangkan) ?). Jika kita sebaliknya secara eksplisit menghapus templat fungsi utama, pesan kesalahan jika tidak ditemukan spesialisasi eksplisit yang cocok menjadi jauh lebih baik, dan juga menunjukkan bahwa penghilangan / penghapusan definisi templat fungsi primer disengaja.
Namun, alih-alih hanya menghilangkan definisi untuk templat fungsi utama di atas, menghasilkan kesalahan referensi yang tidak terdefinisi yang tidak jelas ketika tidak ada spesialisasi eksplisit yang cocok, definisi templat primer dapat dihapus:
Menghasilkan pesan kesalahan yang lebih mudah dibaca, di mana niat penghapusan juga terlihat jelas (di mana kesalahan referensi yang tidak terdefinisi dapat menyebabkan pengembang menganggap ini kesalahan yang tidak terpikirkan).
Kembali ke mengapa kita ingin menggunakan teknik ini? Sekali lagi, spesialisasi eksplisit dapat berguna untuk secara implisit menghapus konversi implisit.
sumber
Ini adalah hal baru dalam standar C ++ 0x di mana Anda dapat menghapus fungsi yang diwarisi.
sumber
void foo(int); template <class T> void foo(T) = delete;
menghentikan semua konversi implisit. Hanya argumenint
tipe yang diterima, semua yang lain akan mencoba untuk instantiate fungsi "dihapus".