Koncepcjaequality_comparable_with<T, U>
ma zadeklarować, że obiekty typu T
i U
moż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_reference
i towarzyszącą mu funkcją wydaje się być umożliwienie iteratorom proxy , aby mieć miejsce do reprezentowania relacji między takimi iteratorami reference
i value_type
dla nich.
To świetnie, ale ... co to ma wspólnego z testowaniem, jeśli a T
i a U
można porównać równe sobie? Dlaczego standard tego wymaga T
i U
ma 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.
źródło
assignable_from
wymagacommon_reference
...Odpowiedzi:
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 == u
z reguły oznacza, żet
iu
są 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_with
nie są pożądane, standard stosuje koncepcję tylko ekspozycjiweakly-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 == u
it2 == u
alet != t2
(jest to faktycznie konieczne w przypadku wartowników).źródło
container<T, stuff>
icontainer<U, other_stuff>
porównywalne, jeśliT
są porównywalneU
)? Czy to po prostucommon_reference
było dostępne, czy może jest coś więcej?