Le conceptequality_comparable_with<T, U>
est destiné à déclarer que les objets de type T
et U
peuvent être comparés égaux les uns aux autres, et s'ils le sont, alors cela a la signification attendue. C'est très bien.
Cependant, ce concept doit également common_reference_t<T&, U&>
exister. L'impulsion principale pour common_reference
et sa fonctionnalité associée semble être de permettre aux itérateurs proxy , d'avoir un endroit pour représenter la relation entre reference
et value_type
pour de tels itérateurs.
C'est super, mais ... qu'est-ce que cela a à voir avec le test si a T
et a U
peuvent être comparés égaux l'un à l'autre? Pourquoi la norme l'exige-t-elle T
et U
a-t-elle une relation de référence commune juste pour vous permettre de les comparer égales?
Cela crée des situations bizarres où il est très difficile d'avoir deux types qui n'ont pas raisonnablement une relation de référence commune qui sont logiquement comparables. Par exemple, vector<int>
et pmr::vector<int>
devrait logiquement être comparable. Mais ils ne peuvent pas l'être parce qu'il n'y a pas de référence commune raisonnable entre les deux types par ailleurs non liés.
la source
assignable_from
nécessitecommon_reference
...Réponses:
Cela remonte au rapport Palo Alto , §3.3 et D.2.
Pour que les concepts de type croisé soient mathématiquement valables, vous devez définir ce que signifie la comparaison de type croisé. Car
equality_comparable_with
,t == u
signifie généralement celat
etu
sont égaux, mais que signifie même que deux valeurs de types différents soient égales? La conception indique que l'égalité entre les types est définie en les mappant au type commun (référence) (cette conversion est nécessaire pour conserver la valeur).Lorsque les axiomes forts de
equality_comparable_with
ne sont pas souhaitables, la norme utilise le concept d'exposition uniquementweakly-equality-comparable-with
, et ce concept ne nécessite pas de référence commune. C'est, cependant, une "abomination sémantique" (selon les mots de Casey Carter) et n'est exposé que pour cette raison: il permet d'avoirt == u
ett2 == u
maist != t2
(c'est en fait nécessaire pour les sentinelles).la source
container<T, stuff>
etcontainer<U, other_stuff>
être comparables siT
est comparable àU
)? Est-ce simplement ce quicommon_reference
était disponible, ou y a-t-il plus que cela?