Czy `equality_comparable_with` wymaga wymagania` common_reference`?

12

Koncepcjaequality_­comparable_with<T, U> ma zadeklarować, że obiekty typu Ti Umożna porównać sobie równe, a jeśli są, to ma oczekiwaną znaczenie. W porządku.

Jednak ta koncepcja również musi common_reference_t<T&, U&>istnieć. Głównym impulsem common_referencei towarzyszącą mu funkcją wydaje się być umożliwienie iteratorom proxy , aby mieć miejsce do reprezentowania relacji między takimi iteratorami referencei value_typedla nich.

To świetnie, ale ... co to ma wspólnego z testowaniem, jeśli a Ti a Umożna porównać równe sobie? Dlaczego standard tego wymaga Ti Uma wspólną relację odniesienia, aby umożliwić porównanie ich na równi?

Stwarza to sytuacje nieparzystej gry, w których bardzo trudno jest mieć dwa typy, które nie mają rozsądnie wspólnego stosunku odniesienia, który jest logicznie porównywalny. Na przykład vector<int>i pmr::vector<int>logicznie powinno być porównywalne. Ale nie mogą tak być, ponieważ nie ma rozsądnego wspólnego odniesienia między tymi dwoma niezwiązanymi ze sobą typami.

Nicol Bolas
źródło
@Marshall poparłby to pytanie.
Barry
Cóż, nawet assignable_fromwymaga common_reference...
cpplearner
@cpplearner: Przynajmniej ma to sens, ponieważ przypisanie jest właściwością, do której odwołania proxy i wartości mają się dzielić.
Nicol Bolas

Odpowiedzi:

4

Odnosi się to do raportu Palo Alto , § 3.3 i D.2.

Aby koncepcje krzyżowe były poprawne matematycznie, musisz zdefiniować, co oznacza porównanie krzyżowe. Dla equality_comparable_with, t == uz reguły oznacza, że ti usą równe, ale co to w ogóle znaczy dla dwóch wartości różnych typów być równa? Projekt mówi, że równość między typami jest definiowana poprzez odwzorowanie ich na typ wspólny (referencyjny) (ta konwersja jest wymagana dla zachowania wartości).

Tam, gdzie silne aksjomaty equality_comparable_withnie są pożądane, standard stosuje koncepcję tylko ekspozycji weakly-equality-comparable-with, a ta koncepcja nie wymaga wspólnego odniesienia. Jest to jednak „obrzydliwość semantyczna” (słowami Casey Carter) i ma wyłącznie charakter ekspozycyjny z tego powodu: pozwala mieć t == ui t2 == uale t != t2(jest to faktycznie konieczne w przypadku wartowników).

TC
źródło
2
To ciekawe, ale to nie tłumaczy, dlaczego „matematyczne” rozwiązanie obejmuje ten typ „wspólnego odniesienia” zamiast… cóż, cokolwiek innego . To znaczy, dlaczego wiąże się to z prowadzeniem tego dorozumianego biznesu konwersji referencji zamiast czegoś, co pozwoliłoby na logicznie uzasadnione matematyczne koncepcje, które nie mogą pozwolić na konwersje (podobne container<T, stuff>i container<U, other_stuff>porównywalne, jeśli Tsą porównywalne U)? Czy to po prostu common_referencebyło dostępne, czy może jest coś więcej?
Nicol Bolas
Brakuje mu pomysłu, że funkcja konwersji do typu common_reference jest epimorfizmem.
Oliv