O conceitoequality_comparable_with<T, U>
se destina a declarar que os objetos do tipo T
e U
pode ser comparado iguais uns aos outros, e se eles são, então este tem o significado esperado. Isso é bom.
No entanto, esse conceito também requer common_reference_t<T&, U&>
a existência. O principal ímpeto common_reference
e sua funcionalidade correspondente parecem permitir os iteradores de proxy , ter um lugar para representar o relacionamento entre reference
e value_type
para esses iteradores.
Isso é ótimo, mas ... o que isso tem a ver com o teste se a T
e a U
podem ser comparados entre si? Por que o padrão exige isso T
e U
tem um relacionamento de referência comum apenas para permitir que você os compare igual?
Isso cria situações estranhas em que é muito difícil ter dois tipos que não têm razoavelmente um relacionamento de referência comum logicamente comparável. Por exemplo, vector<int>
e pmr::vector<int>
logicamente deve ser comparável. Mas não podem ser porque não há uma referência comum razoável entre os dois tipos não relacionados.
fonte
assignable_from
exigecommon_reference
...Respostas:
Isso remonta ao relatório de Palo Alto , §3.3 e D.2.
Para que os conceitos de tipo cruzado sejam matematicamente sólidos, é necessário definir o que significa a comparação de tipo cruzado. Para
equality_comparable_with
,t == u
geralmente significa quet
eu
são iguais, mas o que isso significa mesmo para dois valor de diferentes tipos para ser igual? O design diz que a igualdade de tipo cruzado é definida mapeando-os para o tipo comum (referência) (essa conversão é necessária para preservar o valor).Onde os axiomas fortes de
equality_comparable_with
não são desejáveis, o padrão usa o conceito somente de exposiçãoweakly-equality-comparable-with
, e esse conceito não requer uma referência comum. É, no entanto, uma "abominação semântica" (nas palavras de Casey Carter) e é exposta apenas por esse motivo: permite tert == u
et2 == u
mast != t2
(isso é realmente necessário para sentinelas).fonte
container<T, stuff>
econtainer<U, other_stuff>
ser comparável, seT
for comparável aU
)? É apenas isso quecommon_reference
estava disponível, ou há mais do que isso?