Saya mengalami perilaku aneh dengan operator pesawat ruang angkasa baru <=>
di C ++ 20. Saya menggunakan kompiler Visual Studio 2019 dengan /std:c++latest
.
Kode ini dikompilasi dengan baik, seperti yang diharapkan:
#include <compare>
struct X
{
int Dummy = 0;
auto operator<=>(const X&) const = default; // Default implementation
};
int main()
{
X a, b;
a == b; // OK!
return 0;
}
Namun, jika saya mengubah X ke ini:
struct X
{
int Dummy = 0;
auto operator<=>(const X& other) const
{
return Dummy <=> other.Dummy;
}
};
Saya mendapatkan kesalahan kompilator berikut:
error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator
Saya mencoba ini pada dentang juga, dan saya mendapatkan perilaku yang sama.
Saya akan menghargai beberapa penjelasan tentang mengapa implementasi standar menghasilkan operator==
dengan benar, tetapi yang kustom tidak.
sumber
Selama standardisasi fitur ini, diputuskan bahwa kesetaraan dan pemesanan harus dipisahkan secara logis. Dengan demikian, penggunaan pengujian kesetaraan (
==
dan!=
) tidak akan pernah dimintaoperator<=>
. Namun, itu masih dianggap berguna untuk dapat default keduanya dengan satu deklarasi. Jadi jika Anda defaultoperator<=>
, diputuskan bahwa Anda juga bermaksud defaultoperator==
(kecuali Anda mendefinisikannya nanti atau telah mendefinisikannya sebelumnya).Mengenai mengapa keputusan ini dibuat , alasan dasarnya seperti ini. Pertimbangkan
std::string
. Pemesanan dua string bersifat leksikografis; setiap karakter memiliki nilai integer dibandingkan dengan masing-masing karakter di string lain. Ketidaksetaraan pertama menghasilkan hasil pemesanan.Namun, pengujian kesetaraan string memiliki hubungan arus pendek. Jika kedua string tidak memiliki panjang yang sama, maka tidak ada gunanya melakukan perbandingan karakter-bijaksana sama sekali; mereka tidak setara. Jadi, jika seseorang melakukan pengujian kesetaraan, Anda tidak ingin melakukannya dalam jangka panjang jika Anda dapat membuat hubungan pendek itu.
Ternyata banyak jenis yang membutuhkan pemesanan yang ditentukan pengguna juga akan menawarkan beberapa mekanisme hubungan pendek untuk pengujian kesetaraan. Untuk mencegah orang menerapkan saja
operator<=>
dan membuang potensi kinerja, kami secara efektif memaksa semua orang untuk melakukan keduanya.sumber
Jawaban lain menjelaskan dengan sangat baik mengapa bahasanya seperti ini. Saya hanya ingin menambahkan bahwa jika itu tidak jelas, tentu saja mungkin untuk memiliki yang disediakan pengguna
operator<=>
dengan defaultoperator==
. Anda hanya perlu menulis secara defaultoperator==
:sumber