Концепцияequality_comparable_with<T, U>
призвана заявить , что объекты типа T
и U
могут быть сравнены равны друг другу, и если они есть, то это имеет ожидаемый смысл. Хорошо.
Тем не менее, эта концепция также требует common_reference_t<T&, U&>
существования. common_reference
Похоже, что основным стимулом для его сопутствующей функциональности является предоставление возможности прокси-итераторам иметь возможность представлять отношения между такими итераторами reference
и value_type
для них.
Это здорово, но ... какое это имеет отношение к тестированию, если a T
и a U
можно сравнивать равными друг другу? Почему стандарт требует этого T
и U
имеет общие ссылочные отношения, чтобы вы могли сравнивать их?
Это создает странные ситуации, когда очень трудно иметь два типа, которые не имеют разумных отношений общих ссылок, которые логически сопоставимы. Например, vector<int>
и по pmr::vector<int>
логике должно быть сопоставимо. Но они не могут быть, потому что нет разумной общей ссылки между двумя иначе не связанными типами.
источник
assignable_from
требуетcommon_reference
...Ответы:
Это полностью восходит к отчету Пало-Альто , §3.3 и D.2.
Чтобы понятия перекрестного типа были математически обоснованными, необходимо определить, что означает сравнение перекрестного типа. Ибо
equality_comparable_with
,t == u
как правило, означает, чтоt
иu
равны, но что это означает, что два значения разных типов равны? В проекте говорится, что равенство между типами определяется путем сопоставления их с общим (ссылочным) типом (это преобразование необходимо для сохранения значения).В тех случаях, когда сильные аксиомы
equality_comparable_with
нежелательны, в стандарте используется концепция только для изложенияweakly-equality-comparable-with
, и эта концепция не требует общей ссылки. Это, однако, «семантическая мерзость» (по словам Кейси Картера), и она предназначена только для изложения по этой причине: она позволяет иметьt == u
и,t2 == u
ноt != t2
(это действительно необходимо для стражей).источник
container<T, stuff>
иcontainer<U, other_stuff>
быть сопоставимыми, еслиT
сопоставимы с нимиU
)? Это простоcommon_reference
было доступно, или есть что-то большее?