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
Linda Hamiltonasal
2024-11-07 15:05:03239semak imbas

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
};

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;
    }
};

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

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!

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