Rumah >pembangunan bahagian belakang >C++ >Mengapa Saya Tidak Boleh Menggunakan `==` dan `!=` dengan Operator `<=>` Tersuai dalam C 20?
` Operator dalam C 20? " />
Operator Tidak Lalai <=> dan Ketiadaan == dan !=
Dalam C 20, pengendali kapal angkasa <=> ; menyediakan mekanisme perbandingan tujuan umum Walau bagaimanapun, tingkah laku pelik timbul apabila menggunakan pelaksanaan perbandingan tiga hala tersuai.
Pelaksanaan Lalai Menjana == dan !=
Pertimbangkan kod berikut menggunakan pelaksanaan lalai <=>:
struct X { int Dummy = 0; auto operator<=>(const X&) const = default; // Default implementation };
Dalam kes ini, kod berjaya menyusun dan membenarkan penggunaan == dan != untuk membandingkan kejadian X:
X a, b; a == b; // OK!
Blok Pelaksanaan Tersuai == dan !=
Walau bagaimanapun, apabila pelaksanaan tersuai <=> disediakan:
struct X { int Dummy = 0; auto operator<=>(const X& other) const { return Dummy <=> other.Dummy; } };
Menyusun hasil dalam ralat:
error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator
Sebab Kelakuan
Tingkah laku ini disengajakan mengikut piawaian C 20:
Jika definisi kelas tidak mengisytiharkan fungsi operator == secara eksplisit, tetapi mengisytiharkan fungsi perbandingan tiga hala lalai, fungsi operator == diisytiharkan secara tersirat dengan akses yang sama seperti fungsi operator perbandingan tiga hala. .
Hanya <=> operator menjana == disintesis. Ini kerana kelas seperti std::vector tidak seharusnya menggunakan <=> untuk ujian kesaksamaan, kerana ia mungkin kurang cekap daripada pelaksanaan tersuai.
Oleh itu, jika kelas mempunyai tersuai <=> pelaksanaan, pengaturcara juga mesti menyediakan pelaksanaan == tersuai untuk memastikan tingkah laku perbandingan yang betul.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menggunakan `==` dan `!=` dengan Operator `<=>` Tersuai dalam C 20?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!