N'est-ce pas std::span
conçu comme une référence légère aux sous-régions du tableaustd::vector
/ std::array
/ plain et similaires? Ne devrait-il pas également contenir des opérateurs de comparaison dans son API, pour être cohérent avec eux? Quel était le raisonnement derrière l'exclusion?
Note: par les opérateurs de comparaison, je veux dire soit l'ensemble ( <
, <=
, ...) ou le vaisseau spatial<=>
operator==
est également manquant. Esp. pour le vecteur, je trouve souvent pratique de comparer directement. Cela pourrait être dû à des difficultés avec les types d'étendue de taille statique, bien que je ne sois pas sûr.std::vector
etstd::array
faire? Ils sont déjà définis comme ça pour ces types, alors pourquoi pas ici.span
, mais le projet de norme actuel ne l'inclut pas.gsl::span
ne (et a toujours fait) ont des opérateurs de comparaison. Ils les ont juste déplacés dans leur propre têteRéponses:
Comme l'a souligné Daniel Langr ,
std::span
a des opérateurs de comparaison dans sa proposition initiale P0122 . Ces opérateurs sont ensuite supprimés depuis le projet de travail N4791 , et les raisons sont indiquées dans P1085 .En bref, copy et const for
std::span
sont "superficiels" (ce qui signifie que la copie d'unstd::span
ne copie pas ses éléments sous-jacents et qu'un conststd::span
n'empêche pas la modification de ses éléments sous-jacents), donc les comparaisons, si elles existent, doivent également être "superficielles" pour la cohérence.Ce document donne les exemples suivants:
Exemple 1:
Exemple 2:
Les assertions de ces exemples peuvent échouer si
T = std::span
, alors que ce n'est pas le cas pour les types réguliers.On peut dire que la
std::string_view
copie est superficielle mais que les comparaisons sont profondes. P1085 a également une explication à cela:la source
std::string_view
pointant. Donc, disons,std::map<std::span<T>, U>
est aussi cassé questd::map<std::string_view, U>
. À mon humble avis,std::string_view
ne devrait pas non plus contenir d'opérateurs de comparaison.