Обе онлайн-версия C ++ и cppreference определяют стандартную концепцию Relation
следующим образом:
template <class R, class T, class U>
concept Relation =
std::Predicate<R, T, T> && std::Predicate<R, U, U> &&
std::Predicate<R, T, U> && std::Predicate<R, U, T>;
Это определение удивляет меня, так как я ожидал увидеть что-то вроде
template <class R, class T, class U>
concept Relation = std::Predicate<R, T, U>;
или, возможно,
template <class R, class T, class U>
concept Relation = std::Predicate<R, T, U> && std::Predicate<R, U, T>;
или даже
template <class R, class T, class U>
concept Relation = std::Predicate<R, T, U> || std::Predicate<R, U, T>;
Насколько я понимаю, отношение между типами T
и U
является двоичным предикатом для пар (T, U)
. Таким образом, не имеет смысла оценивать отношение для двух объектов типа T
или двух объектов типа U
. Однако данное определение требует, чтобы отношение вызывалось с аргументами (T,T)
и (U,U)
.
Мой вопрос : какова мотивация этого (казалось бы, неправильного) определения понятия Relation
?
Объяснение, данное в cppreference, гласит, что
Понятие Relation определяет, что R определяет бинарное отношение над набором выражений, тип и категория значений которых кодируются как либо T, либо U .
(акцент мой)
Это звучит странно для меня: почему общая концепция Relation
определяется двумя вспомогательными аргументами двух типов , используемыми в любой комбинации
Одна возможность может заключаться в том, что эта концепция используется для сравнения указателей и nullptr_t
, а также для сравнения итераторов и сторожевых итераторов. Если это так, то почему это понятие называется Relation
, а не чем-то более конкретным, например, InterComparable
? Это просто неправильно?