Files
cppdraft_translate/cppdraft/concept/totallyordered.md
2025-10-25 03:02:53 +03:00

3.8 KiB
Raw Permalink Blame History

[concept.totallyordered]

18 Concepts library [concepts]

18.5 Comparison concepts [concepts.compare]

18.5.5 Concept totally_ordered [concept.totallyordered]

🔗

template<class T> concept [totally_ordered](#concept:totally_ordered "18.5.5Concept totally_­ordered[concept.totallyordered]") = [equality_comparable](concept.equalitycomparable#concept:equality_comparable "18.5.4Concept equality_­comparable[concept.equalitycomparable]")<T> && [partially-ordered-with](cmp.concept#concept:partially-ordered-with "17.12.4Concept three_­way_­comparable[cmp.concept]")<T, T>;

1

#

Given a type T, let a, b, and c be lvalues of type const remove_reference_t.

T models totally_ordered only if

  • (1.1)

    Exactly one of bool(a < b), bool(a > b), or bool(a == b) is true.

  • (1.2)

    If bool(a < b) and bool(b < c), then bool(a < c).

  • (1.3)

    bool(a <= b) == !bool(b < a).

  • (1.4)

    bool(a >= b) == !bool(a < b).

🔗

template<class T, class U> concept [totally_ordered_with](#concept:totally_ordered_with "18.5.5Concept totally_­ordered[concept.totallyordered]") = [totally_ordered](#concept:totally_ordered "18.5.5Concept totally_­ordered[concept.totallyordered]")<T> && [totally_ordered](#concept:totally_ordered "18.5.5Concept totally_­ordered[concept.totallyordered]")<U> && [equality_comparable_with](concept.equalitycomparable#concept:equality_comparable_with "18.5.4Concept equality_­comparable[concept.equalitycomparable]")<T, U> && [totally_ordered](#concept:totally_ordered "18.5.5Concept totally_­ordered[concept.totallyordered]")< common_reference_t< const remove_reference_t<T>&, const remove_reference_t<U>&>> && [partially-ordered-with](cmp.concept#concept:partially-ordered-with "17.12.4Concept three_­way_­comparable[cmp.concept]")<T, U>;

2

#

Given types T and U, let t and t2 be lvalues denoting distinct equal objects of types const remove_reference_t andremove_cvref_t, respectively, let u and u2 be lvalues denoting distinct equal objects of types const remove_reference_t andremove_cvref_t, respectively, and let C be:common_reference_t<const remove_reference_t&, const remove_reference_t&>T and U modeltotally_ordered_with<T, U> only if

  • (2.1)

    bool(t < u) == bool(CONVERT_TO_LVALUE(t2) < CONVERT_TO_LVALUE(u2)).

  • (2.2)

    bool(t > u) == bool(CONVERT_TO_LVALUE(t2) > CONVERT_TO_LVALUE(u2)).

  • (2.3)

    bool(t <= u) == bool(CONVERT_TO_LVALUE(t2) <= CONVERT_TO_LVALUE(u2)).

  • (2.4)

    bool(t >= u) == bool(CONVERT_TO_LVALUE(t2) >= CONVERT_TO_LVALUE(u2)).

  • (2.5)

    bool(u < t) == bool(CONVERT_TO_LVALUE(u2) < CONVERT_TO_LVALUE(t2)).

  • (2.6)

    bool(u > t) == bool(CONVERT_TO_LVALUE(u2) > CONVERT_TO_LVALUE(t2)).

  • (2.7)

    bool(u <= t) == bool(CONVERT_TO_LVALUE(u2) <= CONVERT_TO_LVALUE(t2)).

  • (2.8)

    bool(u >= t) == bool(CONVERT_TO_LVALUE(u2) >= CONVERT_TO_LVALUE(t2)).