Concept Subspace :: sus :: cmp :: Ord
template <class Lhs, class Rhs = Lhs>concept Ord
StrongOrd<Lhs, Rhs> || requires(const std::remove_reference_t<Lhs>& lhs,
const std::remove_reference_t<Rhs>& rhs) {
{ lhs <=> rhs } -> std::same_as<std::weak_ordering>;
}
Concept for types that form a total ordering (aka
std::weak_ordering
).
Types that satisfy Ord
can be sorted or compared and
always return a consistent result as all possible values are comparable.
Objects that compare as equivalent for ordering may still be different
internally and compare as different through operator==
. If unique identity
is required, use StrongOrd
. Otherwise, typically
use Ord
for constraining types that will be ordered.
How can I implement Ord?
Ord
requires that the type has operator<=>
which
returns
std::weak_ordering
(or
std::strong_ordering
).
It will implicitly also be Ord
and
PartialOrd
as a result.
Lexicographical comparison
Lexicographical comparison is an operation with the following properties:
- Two sequences are compared element by element.
- The first mismatching element defines which sequence is lexicographically less or greater than the other.
- If one sequence is a prefix of another, the shorter sequence is lexicographically less than the other.
- If two sequence have equivalent elements and are of the same length, then the sequences are lexicographically equal.
- An empty sequence is lexicographically less than any non-empty sequence.
- Two empty sequences are lexicographically equal.
Ord and Eq interations
While Ord
can report equality, it does not imply that
the type satisfies Eq
, and a separate operator==
is
required for that concept. Unlike
StrongOrd
, it is not required that objects which
are ordered as equivalent also compare as equal with operator==
.
Generic code that requires a type to be Ord
should
take care to use operator<=>
and not operator==
unless also requiring
Eq
, in which case consider requiring
StrongOrd
in place of both
Ord
and Eq
.
Determining Ord strictly
Ord
will be also satisfied if the types satisfy
StrongOrd
. To determine if a
Ord
is the strongest type of ordering between the
types, use ExclusiveOrd
.