Bukan Lalai <=> Operator dan Ketiadaan == dan !=
Dalam C 20, pengendali kapal angkasa yang baru diperkenalkan (<=>) telah mendorong beberapa tingkah laku yang tidak dijangka mengenai penjanaan operator == dan != . Pengguna mungkin menghadapi ralat kompilasi apabila menggunakan pengendali kapal angkasa yang tidak lalai dengan pelaksanaan tersuai.
Secara lalai, pengendali kapal angkasa membandingkan dua objek daripada jenis tertentu. Jika kelas tidak mentakrifkan operator == secara eksplisit tetapi mentakrifkan operator kapal angkasa tidak lalai yang lalai, pengkompil akan menjana operator == secara automatik dengan akses yang sama seperti pengendali kapal angkasa. Tingkah laku ini, yang dinyatakan dalam standard bahasa [class.compare.default], memastikan kelas seperti std::vector tidak menggunakan pengendali kapal angkasa yang tidak lalai untuk ujian kesamaan.
Walau bagaimanapun, jika pengendali kapal angkasa tidak lalai (iaitu, ia mempunyai pelaksanaan tersuai), pengkompil tidak akan menjana operator ==. Ini kerana kelas yang mentakrifkan pengendali kapal angkasa tersuai mungkin memerlukan pelaksanaan khusus untuk == mengendalikan senario perbandingan tertentu. Oleh itu, bahasa menyerahkan kepada pengaturcara untuk mentakrif operator == secara eksplisit jika diperlukan.
Sebagai contoh, pertimbangkan kod berikut:
#include <compare> struct X { int Dummy = 0; auto operator<=>(const X&) const = default; // Default implementation };
Kod ini berjaya menyusun kerana kapal angkasa operator lalai, dan pengkompil menjana operator ==. Walau bagaimanapun, jika kita menukar pengendali kapal angkasa kepada pelaksanaan tersuai:
struct X { int Dummy = 0; auto operator<=>(const X& other) const { return Dummy <=> other.Dummy; } };
Kod kini akan gagal untuk disusun, dengan ralat menunjukkan bahawa operator == tidak ditakrifkan untuk kelas X. Ini kerana pengendali kapal angkasa yang diubah suai tidak lalai, dan pengkompil tidak menjana operator == secara automatik. Dalam kes ini, pengguna perlu mentakrifkan operator == secara eksplisit untuk menangani keperluan perbandingan kelas tersuai mereka.
Atas ialah kandungan terperinci Mengapa Operator `kapal angkasa` Tersuai Tidak Menghasilkan Operator `==` dan `!=` dalam C 20?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!