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

Концепция equality_­comparable_with<T, U> предназначена для объявления, что объекты типа T и U могут сравниваться равными друг другу, и если они есть, то это имеет ожидаемое значение. Это нормально.

Однако для этой концепции также требуется common_reference_t<T&, U&>. Похоже, что основным стимулом для common_reference и его сопутствующей функциональности является , позволяющий прокси-итераторам иметь место для представления взаимосвязи между reference и value_type для таких итераторов.

Это замечательно, но ... какое это имеет отношение к тестированию, если T и U можно сравнить равными друг другу? Почему стандарт требует, чтобы T и U имели общие эталонные отношения, чтобы вы могли сравнивать их равными?

Это создает странные ситуации, когда очень трудно иметь два типа, которые не обоснованно иметь общие ссылки, которые логически сопоставимы. Например, vector<int> и pmr::vector<int> должны быть логически сопоставимы. Но они не могут быть, потому что нет разумной общей ссылки между двумя иначе не связанными типами.

1 Ответ

4 голосов
/ 13 апреля 2020

Это относится к отчету Пало-Альто , §3.3 и D.2.

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

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

...