Rumah > pembangunan bahagian belakang > C++ > Mengapa Pengendali Kapal Angkasa Tersuai dalam C 20 Menghalang Perbandingan Kesaksamaan Automatik?

Mengapa Pengendali Kapal Angkasa Tersuai dalam C 20 Menghalang Perbandingan Kesaksamaan Automatik?

Linda Hamilton
Lepaskan: 2024-11-07 15:05:03
asal
197 orang telah melayarinya

Why Does a Custom Spaceship Operator in C  20 Prevent Automatic Equality Comparison?

Operator Kapal Angkasa dan Perbandingan Kesaksamaan

Pengendali kapal angkasa C 20 (juga dikenali sebagai <=>) memperkenalkan sintaks yang mudah dan ringkas untuk membandingkan nilai. Walau bagaimanapun, dalam senario tertentu, ia mungkin tidak menjana pengendali kesaksamaan dan ketidaksamaan yang dijangkakan (== dan !=). Soalan ini meneroka gelagat ini dan sebab pelaksanaan pengendali kapal angkasa tersuai boleh menghalang penciptaan operator tambahan ini.

Penerangan Masalah

Pertimbangkan coretan kod berikut di mana pengendali kapal angkasa digunakan dalam struct dengan pelaksanaan lalai:

struct X
{
    int Dummy = 0;
    auto operator<=>(const X& other) const = default; // Default implementation
};
Salin selepas log masuk

Kod ini disusun tanpa ralat. Walau bagaimanapun, jika kami mentakrifkan pelaksanaan pengendali kapal angkasa tersuai:

struct X
{
    int Dummy = 0;
    auto operator<=>(const X& other) const
    {
        return Dummy <=> other.Dummy;
    }
};
Salin selepas log masuk

Pengkompil akan mengeluarkan ralat apabila cuba menggunakan operator kesamarataan (==):

error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator
Salin selepas log masuk

Penjelasan

Tingkah laku ini disengajakan, seperti yang ditakrifkan oleh standard bahasa. Apabila kelas mempunyai pengendali kapal angkasa yang lalai, pengkompil mensintesis pelaksanaan lalai pengendali kesaksamaan. Walau bagaimanapun, jika pengendali kapal angkasa dilaksanakan dengan definisi tersuai, pengkompil tidak menjana pengendali kesaksamaan secara automatik.

Perbezaan ini berpunca daripada kebimbangan mengenai kecekapan. Pengendali kapal angkasa direka untuk menyediakan susunan nilai yang lengkap, manakala pengendali kesaksamaan (==) boleh melakukan pengoptimuman, seperti membandingkan saiz sebelum mencuba perbandingan penuh. Untuk kelas seperti std::vector, menggunakan operator kapal angkasa untuk perbandingan kesamaan mungkin bukan pendekatan yang paling cekap.

Dengan menyerahkannya kepada pengaturcara untuk melaksanakan pengendali kesamaan, pengkompil mengelakkan potensi untuk menjana bukan -pelaksanaan yang optimum. Oleh itu, jika kelas mempunyai pengendali kapal angkasa yang tidak lalai, pembangun mesti mentakrifkan pengendali kesaksamaan secara eksplisit juga.

Atas ialah kandungan terperinci Mengapa Pengendali Kapal Angkasa Tersuai dalam C 20 Menghalang Perbandingan Kesaksamaan Automatik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan