Bukankah itu std::span
dirancang sebagai referensi ringan untuk sub-daerah arraystd::vector
/ std::array
/ dan sama-sama? Bukankah seharusnya juga memuat operator perbandingan di API-nya, agar konsisten dengan mereka? Apa alasan di balik pengecualian ini?
Catatan: oleh operator perbandingan, maksud saya baik set lengkap ( <
, <=
, ...) atau pesawat ruang angkasa<=>
operator==
juga hilang. Esp. untuk vektor saya sering merasa nyaman untuk membandingkan secara langsung. Bisa jadi karena kesulitan mungkin dengan jenis rentang ukuran statis, meskipun saya tidak yakin.std::vector
danstd::array
lakukan? Mereka sudah didefinisikan seperti itu untuk tipe-tipe itu, jadi mengapa tidak di sini.span
, tetapi standar konsep saat ini tidak memasukkannya.gsl::span
memang (dan selalu) memiliki operator pembanding. Mereka baru saja memindahkan mereka ke headerJawaban:
Seperti yang ditunjukkan Daniel Langr ,
std::span
memiliki operator pembanding dalam proposal awal P0122 . Operator-operator ini kemudian dihapus sejak draft kerja N4791 , dan alasannya dinyatakan dalam P1085 .Singkatnya, copy dan const
std::span
adalah "dangkal" (artinya menyalin astd::span
tidak menyalin elemen-elemen yang mendasarinya, dan sebuah conststd::span
tidak mencegah elemen-elemen yang mendasarinya untuk dimodifikasi), jadi perbandingan, jika ada, juga harus "dangkal" untuk konsistensi.Makalah itu memberikan contoh-contoh berikut:
Contoh 1:
Contoh 2:
Pernyataan dalam contoh-contoh ini mungkin gagal jika
T = std::span
, sementara itu tidak untuk tipe reguler.Orang mungkin berpendapat bahwa
std::string_view
memiliki salinan dangkal tetapi perbandingan yang mendalam. P1085 juga memiliki penjelasan untuk ini:sumber
std::string_view
menunjuk ke sana. Jadi, katakanlah,std::map<std::span<T>, U>
sama rusaknya denganstd::map<std::string_view, U>
. IMHO,std::string_view
tidak boleh mengandung operator pembanding.