Mengapa Operator `kapal angkasa` Tersuai Tidak Menghasilkan Operator `==` dan `!=` dalam C 20?

Patricia Arquette
Lepaskan: 2024-11-07 05:35:02
asal
291 orang telah melayarinya

Why Doesn't a Custom `spaceship` Operator Generate `==` and `!=` Operators in C  20?

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
};
Salin selepas log masuk

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&amp; other) const
    {
        return Dummy <=> other.Dummy;
    }
};
Salin selepas log masuk

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!