El conceptoequality_comparable_with<T, U> tiene la intención de declarar que los objetos de tipo Ty Use pueden comparar iguales entre sí, y si lo son, entonces esto tiene el significado esperado. Esta bien.
Sin embargo, este concepto también requiere common_reference_t<T&, U&>existir. El ímpetu principal common_referencey la funcionalidad que lo acompaña parecen ser habilitar los iteradores proxy , tener un lugar para representar la relación entre referencey value_typepara dichos iteradores.
Eso es genial, pero ... ¿qué tiene eso que ver con probar si a Ty a Use pueden comparar entre sí? ¿Por qué el estándar requiere eso Ty Utiene una relación de referencia común solo para permitirle compararlos de la misma manera?
Esto crea situaciones extrañas en las que es muy difícil tener dos tipos que no tengan una relación de referencia común que sean lógicamente comparables. Por ejemplo, vector<int>y pmr::vector<int>lógicamente debería ser comparable. Pero no pueden serlo porque no hay una referencia común razonable entre los dos tipos que de otro modo no estarían relacionados.
fuente

assignable_fromrequierecommon_reference...Respuestas:
Esto se remonta al informe de Palo Alto , §3.3 y D.2.
Para que los conceptos de tipo cruzado sean matemáticamente sólidos, debe definir qué significa la comparación de tipo cruzado. Porque
equality_comparable_with,t == ugeneralmente significa esotyuson iguales, pero ¿qué significa que dos valores de diferentes tipos sean iguales? El diseño dice que la igualdad de tipo cruzado se define al asignarlos al tipo común (referencia) (esta conversión es necesaria para preservar el valor).Cuando los axiomas fuertes de
equality_comparable_withno son deseables, el estándar utiliza el concepto de solo exposiciónweakly-equality-comparable-with, y ese concepto no requiere una referencia común. Sin embargo, es una "abominación semántica" (en palabras de Casey Carter) y es solo una exposición por esa razón: permite tenert == uyt2 == uperot != t2(esto es realmente necesario para los centinelas).fuente
container<T, stuff>ycontainer<U, other_stuff>ser comparable siTes comparable aU)? ¿Es solo quecommon_referenceestaba disponible, o hay más que eso?