¿Igualdad_comparable_con` necesita requerir `common_reference`?

12

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.

Nicol Bolas
fuente
@Marshall aprobaría esta pregunta.
Barry
Bueno, incluso assignable_fromrequiere common_reference...
cpplearner
@cpplearner: Eso al menos tiene sentido, ya que la asignación es una propiedad que se espera que compartan referencias y valores proxy.
Nicol Bolas

Respuestas:

4

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 eso ty uson 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ón weakly-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 tener t == uy t2 == upero t != t2(esto es realmente necesario para los centinelas).

TC
fuente
2
Eso es interesante, pero eso no explica por qué la solución "matemáticamente sólida" involucra este tipo de "referencia común" en lugar de ... bueno, cualquier otra cosa . Es decir, ¿por qué implica hacer este negocio de conversión de referencia implícita en lugar de algo que permitiría conceptos lógicamente matemáticamente sólidos que no pueden permitir conversiones (como container<T, stuff>y container<U, other_stuff>ser comparable si Tes comparable a U)? ¿Es solo que common_referenceestaba disponible, o hay más que eso?
Nicol Bolas
Carece de la idea de que la función de conversión al tipo common_reference es un epimorfismo.
Oliv