Apakah `equality_comparable_with` perlu memerlukan` common_reference`?

12

The Konsepequality_­comparable_with<T, U> ini dimaksudkan untuk menyatakan bahwa objek dari jenis Tdan Udapat 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_referencedan fungsi petugasnya tampaknya adalah untuk mengaktifkan iterator proxy , untuk memiliki tempat untuk mewakili hubungan antara referencedan value_typeuntuk iterator tersebut.

Itu bagus, tapi ... apa hubungannya dengan pengujian jika a Tdan a Udapat dibandingkan dengan satu sama lain? Mengapa standar mengharuskan itu Tdan Umemiliki 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.

Nicol Bolas
sumber
@ Marshall akan menyetujui pertanyaan ini.
Barry
Bahkan assignable_frommembutuhkan common_reference...
cpplearner
@ cpplearner: Setidaknya itu agak masuk akal, karena penugasan adalah properti yang diharapkan untuk dibagikan oleh referensi dan nilai proxy.
Nicol Bolas

Jawaban:

4

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 == usecara umum berarti tdan usama, 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_withtidak diinginkan, standar menggunakan konsep eksposisi saja weakly-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: memungkinkan t == udan t2 == utetapi t != t2(ini sebenarnya diperlukan untuk penjaga).

TC
sumber
2
Itu menarik, tetapi itu tidak menjelaskan mengapa solusi "suara matematis" melibatkan jenis "referensi umum" ini bukannya ... well, hal lain . Artinya, mengapa itu melibatkan melakukan bisnis konversi referensi tersirat ini daripada sesuatu yang akan memungkinkan untuk konsep logis logis secara matematis yang tidak dapat mengizinkan konversi (seperti container<T, stuff>dan container<U, other_stuff>dapat dibandingkan jika Tsebanding dengan U)? Apakah hanya itu common_referenceyang tersedia, atau ada lebih dari itu?
Nicol Bolas
Tidak memiliki gagasan bahwa fungsi konversi ke tipe common_reference adalah epimorfisme.
Oliv