O `equal_comparable_with` precisa exigir o` common_reference`?

12

O conceitoequality_­comparable_with<T, U> se destina a declarar que os objetos do tipo Te Upode 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_referencee sua funcionalidade correspondente parecem permitir os iteradores de proxy , ter um lugar para representar o relacionamento entre referencee value_typepara esses iteradores.

Isso é ótimo, mas ... o que isso tem a ver com o teste se a Te a Upodem ser comparados entre si? Por que o padrão exige isso Te Utem 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.

Nicol Bolas
fonte
@Marshall aprovaria esta pergunta.
Barry
Bem, mesmo assignable_fromexige common_reference...
cpplearner 13/04
@ cpplearner: Isso pelo menos um pouco faz sentido, pois a atribuição é uma propriedade que as referências e valores de proxy devem compartilhar.
Nicol Bolas 13/04

Respostas:

4

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 == ugeralmente significa que te usã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_withnão são desejáveis, o padrão usa o conceito somente de exposição weakly-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 ter t == ue t2 == umas t != t2(isso é realmente necessário para sentinelas).

TC
fonte
2
Isso é interessante, mas isso não explica por que a solução "matematicamente correta" envolve esse tipo de "referência comum" em vez de ... bem, qualquer outra coisa . Ou seja, por que isso envolve fazer negócios implícitos de conversão de referência em vez de algo que permita conceitos logicamente matematicamente sólidos que não podem permitir conversões (como container<T, stuff>e container<U, other_stuff>ser comparável, se Tfor comparável a U)? É apenas isso que common_referenceestava disponível, ou há mais do que isso?
Nicol Bolas
Não existe a ideia de que a função de conversão para o tipo common_reference seja um epimorfismo.
Oliv