Ketika saya mencoba mempelajari tentang operator C ++ , saya menemukan sebuah operator perbandingan aneh di cppreference.com , * dalam tabel yang terlihat seperti ini:
"Yah, jika ini adalah operator umum di C ++, saya lebih baik mempelajarinya", pikir saya. Tetapi semua upaya saya untuk menjelaskan misteri ini tidak berhasil. Bahkan di sini, di Stack Overflow, saya tidak beruntung dalam pencarian saya.
Apakah ada koneksi antara <=> dan C ++ ?
Dan jika ada, apa tepatnya yang dilakukan operator ini?
* Sementara itu cppreference.com memperbarui halaman itu dan sekarang berisi informasi tentang <=>
operator.
bar< foo::operator<=>
adalah contoh bagaimana bisa seperti<--
operator.Jawaban:
Ini disebut operator perbandingan tiga arah .
Menurut proposal makalah P0515 :
The cppreference mengatakan:
sumber
<0
", "membandingkan>0
", dan "membandingkan==0
", mereka berarti<=>
pengembalian nilai negatif, positif, atau nol, tergantung pada argumen. Sangat miripstrncmp
danmemcmp
.'a' < 'a'
dan'c' < 'a'
keduanya salah,'a' < 'a'
dan'a' < 'c'
tidak. DALAM urutan pemesanan yang kuat adalah benar:a != b
→a < b || b < a
operator==(T x, T y) { return !(x < y) && !(y < x); }
danoperator!=(T x, T y) { return (x < y) || (y < x); }
- ah-ha! Tentu saja ini kurang efisien daripada yang benar==
karena meminta perbandingan dua kali, tetapi masih rapi.< 0
bernilai true. Artinya, jikaa < b
kemudian(a <=> b) < 0
selalu benar.Pada 2017-11-11 , komite ISO C ++ mengadopsi proposal Herb Sutter untuk operator perbandingan tiga arah <=> "pesawat ruang angkasa" sebagai salah satu fitur baru yang ditambahkan ke C ++ 20 . Dalam makalah berjudul Sutter perbandingan Konsisten , Maurer dan Brown mendemonstrasikan konsep-konsep desain baru. Untuk ikhtisar proposal, berikut adalah kutipan dari artikel:
Kategori Perbandingan
Lima kategori perbandingan didefinisikan sebagai
std::
tipe, masing-masing memiliki nilai yang telah ditentukan sebelumnya:Konversi tersirat di antara jenis-jenis ini didefinisikan sebagai berikut:
strong_ordering
dengan nilai-nilai {less
,equal
,greater
} implisit mengkonversi ke:weak_ordering
dengan nilai-nilai {less
,equivalent
,greater
}partial_ordering
dengan nilai-nilai {less
,equivalent
,greater
}strong_equality
dengan nilai-nilai {unequal
,equal
,unequal
}weak_equality
dengan nilai-nilai {nonequivalent
,equivalent
,nonequivalent
}weak_ordering
dengan nilai-nilai {less
,equivalent
,greater
} implisit mengkonversi ke:partial_ordering
dengan nilai-nilai {less
,equivalent
,greater
}weak_equality
dengan nilai-nilai {nonequivalent
,equivalent
,nonequivalent
}partial_ordering
dengan nilai-nilai {less
,equivalent
,greater
,unordered
} implisit mengkonversi ke:weak_equality
dengan nilai-nilai {nonequivalent
,equivalent
,nonequivalent
,nonequivalent
}strong_equality
dengan nilai {equal
,unequal
} secara implisit dikonversi ke:weak_equality
dengan nilai {equivalent
,nonequivalent
}Perbandingan tiga arah
The
<=>
token diperkenalkan. Urutan karakter<=>
menjadi tokenizes<= >
, dalam kode sumber lama. Misalnya,X<&Y::operator<=>
perlu menambahkan ruang untuk mempertahankan maknanya.Operator kelebihan beban
<=>
adalah fungsi perbandingan tiga arah dan memiliki prioritas lebih tinggi dari<
dan lebih rendah dari<<
. Ini mengembalikan jenis yang dapat dibandingkan dengan literal0
tetapi jenis kembali lainnya diizinkan seperti untuk mendukung templat ekspresi. Semua<=>
operator yang didefinisikan dalam bahasa dan di perpustakaan standar mengembalikan salah satu dari 5std::
jenis kategori perbandingan yang disebutkan di atas .Untuk jenis bahasa,
<=>
perbandingan built-in dengan jenis yang sama disediakan. Semua adalah constexpr , kecuali jika disebutkan sebaliknya. Perbandingan ini tidak dapat dilakukan secara heterogen menggunakan promosi / konversi skalar.bool
, integral, dan tipe penunjuk,<=>
pengembalianstrong_ordering
.<=>
, dan ada built-in yang heterogenoperator<=>(T*, nullptr_t)
. Hanya perbandingan pointer ke objek / alokasi yang sama yang merupakan ekspresi konstan.<=>
pengembalianpartial_ordering
, dan dapat dipanggil secara heterogen dengan memperluas argumen ke tipe floating point yang lebih besar.<=>
kembalikan sama dengan tipe dasar enumerasi<=>
.nullptr_t
,<=>
pengembalian ,strong_ordering
dan selalu hasilequal
.T[N] <=> T[N]
mengembalikan jenis yang sama sepertiT
's<=>
dan Melakukan perbandingan elementwise leksikografis. Tidak ada<=>
untuk array lainnya.void
tidak ada<=>
.Untuk lebih memahami cara kerja bagian dalam operator ini, silakan baca makalah aslinya . Ini adalah apa yang saya temukan menggunakan mesin pencari.
sumber
_equality
tipe - tipe itu mati: ternyata<=>
cocok dengan empat operator relasional tetapi tidak juga dengan dua operator kesetaraan (walaupun ada beberapa gula sintaksis yang kuat untuk mendukung kasus umum di mana Anda menginginkan semuanya).Jawaban ini menjadi tidak relevan karena halaman web yang dirujuk telah berubah
The web page Anda referensi rusak. Itu sedang banyak diedit hari itu dan bagian yang berbeda tidak sinkron. Status ketika saya melihatnya adalah:
Di bagian atas halaman ini daftar operator perbandingan yang ada saat ini (dalam C ++ 14). Tidak ada
<=>
disana.Di bagian bawah halaman, mereka seharusnya mendaftar operator yang sama, tetapi mereka melakukan kesalahan dan menambahkan saran ini di masa depan.
gcc
belum tahu tentang<=>
(dan dengan-std=c++14
, tidak akan pernah), jadi menurut Anda maksud Andaa <= > b
. Ini menjelaskan pesan kesalahan.Jika Anda mencoba hal yang sama lima tahun dari sekarang, Anda mungkin akan mendapatkan pesan kesalahan yang lebih baik, seperti
<=> not part of C++14.
sumber
<=>
operator dengan label (karena C ++ 20), memberi tahu Anda versi standar mana yang diharapkan. Pelabelan standar adalah konvensi yang diikuti oleh cppreference.com. Tentu saja Anda tidak memiliki kompiler yang kembali dalam mesin waktu untuk mendukungnya untuk Anda, tetapi cpprefernce memberi tahu Anda (dengan benar) apa yang diharapkan.