Требуется ли для «равенства_компараблей_схем» `общего_референции`?

12

Концепция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>логике должно быть сопоставимо. Но они не могут быть, потому что нет разумной общей ссылки между двумя иначе не связанными типами.

Николь Болас
источник
@Marshall одобрил бы этот вопрос.
Барри
Ну, даже assignable_fromтребует common_reference...
cpplearner
@cpplearner: По крайней мере, это имеет некоторый смысл, так как присваивание - это свойство, которое должны совместно использоваться ссылками и значениями прокси.
Никол Болас

Ответы:

4

Это полностью восходит к отчету Пало-Альто , §3.3 и D.2.

Чтобы понятия перекрестного типа были математически обоснованными, необходимо определить, что означает сравнение перекрестного типа. Ибо equality_comparable_with, t == uкак правило, означает, что tи uравны, но что это означает, что два значения разных типов равны? В проекте говорится, что равенство между типами определяется путем сопоставления их с общим (ссылочным) типом (это преобразование необходимо для сохранения значения).

В тех случаях, когда сильные аксиомы equality_comparable_withнежелательны, в стандарте используется концепция только для изложения weakly-equality-comparable-with, и эта концепция не требует общей ссылки. Это, однако, «семантическая мерзость» (по словам Кейси Картера), и она предназначена только для изложения по этой причине: она позволяет иметь t == uи, t2 == uно t != t2(это действительно необходимо для стражей).

TC
источник
2
Это интересно, но это не объясняет, почему «математически обоснованное» решение использует этот тип «общего эталона» вместо ... ну, ничего другого . То есть, почему это подразумевает создание этого неявного бизнеса по преобразованию ссылок вместо того, чтобы допускать логически математически обоснованные концепции, которые не могут допускать преобразования (например, container<T, stuff>и container<U, other_stuff>быть сопоставимыми, если Tсопоставимы с ними U)? Это просто common_referenceбыло доступно, или есть что-то большее?
Никол Болас
Ему не хватает идеи, что функция преобразования в тип common_reference является эпиморфизмом.
Олив