El conceptoequality_comparable_with<T, U>
tiene la intención de declarar que los objetos de tipo T
y U
se 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_reference
y la funcionalidad que lo acompaña parecen ser habilitar los iteradores proxy , tener un lugar para representar la relación entre reference
y value_type
para dichos iteradores.
Eso es genial, pero ... ¿qué tiene eso que ver con probar si a T
y a U
se pueden comparar entre sí? ¿Por qué el estándar requiere eso T
y U
tiene 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_from
requierecommon_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 == u
generalmente significa esot
yu
son 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_with
no 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 == u
yt2 == u
perot != t2
(esto es realmente necesario para los centinelas).fuente
container<T, stuff>
ycontainer<U, other_stuff>
ser comparable siT
es comparable aU
)? ¿Es solo quecommon_reference
estaba disponible, o hay más que eso?