The Konsepequality_comparable_with<T, U>
ini dimaksudkan untuk menyatakan bahwa objek dari jenis T
dan U
dapat dibandingkan sama satu sama lain, dan jika mereka, maka ini memiliki arti yang diharapkan. Tidak apa-apa.
Namun, konsep ini juga perlu common_reference_t<T&, U&>
ada. Dorongan utama untuk common_reference
dan fungsi petugasnya tampaknya adalah untuk mengaktifkan iterator proxy , untuk memiliki tempat untuk mewakili hubungan antara reference
dan value_type
untuk iterator tersebut.
Itu bagus, tapi ... apa hubungannya dengan pengujian jika a T
dan a U
dapat dibandingkan dengan satu sama lain? Mengapa standar mengharuskan itu T
dan U
memiliki hubungan referensi yang sama hanya untuk memungkinkan Anda membandingkannya dengan setara?
Ini menciptakan situasi yang aneh di mana sangat sulit untuk memiliki dua jenis yang tidak cukup memiliki hubungan referensi umum yang secara logika sebanding. Misalnya, vector<int>
dan pmr::vector<int>
secara logis harus sebanding. Tapi mereka tidak bisa karena tidak ada referensi umum yang masuk akal antara dua jenis yang tidak berhubungan.
sumber
assignable_from
membutuhkancommon_reference
...Jawaban:
Ini kembali ke laporan Palo Alto , §3.3 dan D.2.
Agar konsep lintas-jenis menjadi logis secara matematis, Anda perlu mendefinisikan apa arti perbandingan lintas-jenis. Sebab
equality_comparable_with
,t == u
secara umum berartit
danu
sama, tetapi apa artinya bahkan dua nilai dari jenis yang berbeda sama? Desain mengatakan bahwa kesetaraan tipe silang didefinisikan dengan memetakannya ke tipe umum (referensi) (konversi ini diperlukan untuk mempertahankan nilainya).Ketika aksioma kuat
equality_comparable_with
tidak diinginkan, standar menggunakan konsep eksposisi sajaweakly-equality-comparable-with
, dan konsep itu tidak memerlukan referensi umum. Namun, ini adalah "kekejian semantik" (dalam kata-kata Casey Carter) dan hanya eksposisi karena alasan itu: memungkinkant == u
dant2 == u
tetapit != t2
(ini sebenarnya diperlukan untuk penjaga).sumber
container<T, stuff>
dancontainer<U, other_stuff>
dapat dibandingkan jikaT
sebanding denganU
)? Apakah hanya itucommon_reference
yang tersedia, atau ada lebih dari itu?