Rumah >pembangunan bahagian belakang >C++ >Mengapa Saya Tidak Boleh Menggunakan `==` dan `!=` dengan Operator `<=>` Tersuai dalam C 20?

Mengapa Saya Tidak Boleh Menggunakan `==` dan `!=` dengan Operator `<=>` Tersuai dalam C 20?

Linda Hamilton
Linda Hamiltonasal
2024-11-07 21:11:031097semak imbas

Why Can't I Use `==` and `!=` with a Custom `<=>` Operator 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&amp;) 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&amp; 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn