Est-ce que `égalité_comparable_avec` doit exiger` common_reference`?

12

Le conceptequality_­comparable_with<T, U> est destiné à déclarer que les objets de type Tet Upeuvent ê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_referenceet sa fonctionnalité associée semble être de permettre aux itérateurs proxy , d'avoir un endroit pour représenter la relation entre referenceet value_typepour de tels itérateurs.

C'est super, mais ... qu'est-ce que cela a à voir avec le test si a Tet a Upeuvent être comparés égaux l'un à l'autre? Pourquoi la norme l'exige-t-elle Tet Ua-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.

Nicol Bolas
la source
@Marshall approuverait cette question.
Barry
Eh bien, même assignable_fromnécessite common_reference...
cpplearner
@cpplearner: Cela a au moins un certain sens, car l'affectation est une propriété que les références et les valeurs proxy sont censées partager.
Nicol Bolas

Réponses:

4

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 == usignifie généralement cela tet usont é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_withne sont pas souhaitables, la norme utilise le concept d'exposition uniquement weakly-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'avoir t == uet t2 == umais t != t2(c'est en fait nécessaire pour les sentinelles).

TC
la source
2
C'est intéressant, mais cela n'explique pas pourquoi la solution "mathématiquement saine" implique ce type de "référence commune" au lieu de ... enfin, rien d'autre . Autrement dit, pourquoi cela implique-t-il de faire cette entreprise de conversion de référence implicite au lieu de quelque chose qui permettrait des concepts logiquement mathématiquement solides qui ne peuvent pas permettre des conversions (comme container<T, stuff>et container<U, other_stuff>être comparables si Test comparable à U)? Est-ce simplement ce qui common_referenceétait disponible, ou y a-t-il plus que cela?
Nicol Bolas
Il manque l'idée que la fonction de conversion en type common_reference est un épimorphisme.
Oliv