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:
Ekspresi a <=> b mengembalikan objek yang membandingkan <0 jika a <b , membandingkan > 0 jika a> b , dan membandingkan == 0 jika a dan b sama / setara.
Kasus umum: Untuk menulis semua perbandingan untuk tipe X Anda dengan tipe Y , dengan semantik anggota, cukup tulis:
auto X::operator<=>(const Y&) =default;
Kasus tingkat lanjut: Untuk menulis semua perbandingan untuk tipe X Anda dengan tipe Y , cukup tulis operator <=> yang menggunakan Y , dapat menggunakan
= default untuk mendapatkan semantik yang sesuai dengan anggota jika diinginkan, dan mengembalikan jenis kategori yang sesuai:
- Kembalikan _ordering jika jenis Anda secara alami mendukung < , dan kami akan secara efisien menghasilkan simetris < , > , <= , > = , == , dan
! = ; jika tidak mengembalikan _equality , dan kami akan menghasilkan symmetric == dan ! = secara efisien .
- Kembalikan strong_ jika untuk tipe Anda a == b menyiratkan f (a) == f (b) (dapat disubstitusikan, di mana f hanya membaca keadaan yang menonjol perbandingan yang dapat diakses menggunakan anggota const publik ), jika tidak kembalikan
lemah_ .
Kategori Perbandingan
Lima kategori perbandingan didefinisikan sebagai std::
tipe, masing-masing memiliki nilai yang telah ditentukan sebelumnya:
+--------------------------------------------------------------------+
| | Numeric values | Non-numeric |
| Category +-----------------------------------+ |
| | -1 | 0 | +1 | values |
+------------------+------+------------+---------------+-------------+
| strong_ordering | less | equal | greater | |
| weak_ordering | less | equivalent | greater | |
| partial_ordering | less | equivalent | greater | unordered |
| strong_equality | | equal | nonequal | |
| weak_equality | | equivalent | nonequivalent | |
+------------------+------+------------+---------------+-------------+
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 literal 0
tetapi jenis kembali lainnya diizinkan seperti untuk mendukung templat ekspresi. Semua <=>
operator yang didefinisikan dalam bahasa dan di perpustakaan standar mengembalikan salah satu dari 5 std::
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.
- Untuk
bool
, integral, dan tipe penunjuk, <=>
pengembalian strong_ordering
.
- Untuk tipe penunjuk, berbagai kualifikasi-cv dan konversi turunan ke basis diizinkan untuk memanggil built-in yang homogen
<=>
, dan ada built-in yang heterogen operator<=>(T*, nullptr_t)
. Hanya perbandingan pointer ke objek / alokasi yang sama yang merupakan ekspresi konstan.
- Untuk tipe floating point yang mendasar,
<=>
pengembalian partial_ordering
, dan dapat dipanggil secara heterogen dengan memperluas argumen ke tipe floating point yang lebih besar.
- Untuk enumerasi,
<=>
kembalikan sama dengan tipe dasar enumerasi <=>
.
- Untuk
nullptr_t
, <=>
pengembalian , strong_ordering
dan selalu hasil equal
.
- Untuk array menyatakan bahwa pihak,
T[N] <=> T[N]
mengembalikan jenis yang sama seperti T
's <=>
dan Melakukan perbandingan elementwise leksikografis. Tidak ada <=>
untuk array lainnya.
- Karena
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.