**Section:** 18.5.5 [concept.totallyordered] **Status:** C++20
**Submitter:** Great Britain **Opened:** 2019-11-08 **Last modified:** 2021-02-25 10:48:01 UTC

**Priority: **0

**View all other** issues in [concept.totallyordered].

**View all issues with** C++20 status.

**Discussion:**

**Addresses GB 202**

Define `totally_ordered[_with]`
in terms of ` partially-ordered-with`.
This will simplify the definition of both concepts
(particularly

Proposed change:

template<class T> concept totally_ordered = equality_comparable<T> &&partially-ordered-with<T, T>; template<class T, class U> concept totally_ordered_with = totally_ordered<T> && totally_ordered<U> && common_reference_with< const remove_reference_t<T>&, const remove_reference_t<U>&> && totally_ordered< common_reference_t< const remove_reference_t<T>&, const remove_reference_t<U>&>> && equality_comparable_with<T, U> &&partially-ordered-with<T, U>;

LWG discussion in Belfast notes that 3329
also touches the definition of `totally_ordered_with`;
the two sets of changes are consistent.

*[2019-11 Status to Ready Friday afternoon LWG in Belfast]*

**Proposed resolution:**

This wording is relative to N4835.

Change 18.5.5 [concept.totallyordered] as follows:

template<class T> concept totally_ordered = equality_comparable<T> &&

*partially-ordered-with*<T, T>;~~requires(const remove_reference_t<T>& a,~~~~const remove_reference_t<T>& b) {~~~~{ a < b } -> boolean;~~~~{ a > b } -> boolean;~~~~{ a <= b } -> boolean;~~~~{ a >= b } -> boolean;~~~~};~~-1- For some type

`T`, let`a`,`b`, and`c`be lvalues of type`const remove_reference_t<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(b < a)`.(1.5) —

`bool(a >= b) == !bool(a < b)`.template<class T, class U> concept totally_ordered_with = totally_ordered<T> && totally_ordered<U> && common_reference_with<const remove_reference_t<T>&, const remove_reference_t<U>&> && totally_ordered< common_reference_t< const remove_reference_t<T>&, const remove_reference_t<U>&>> && equality_comparable_with<T, U> &&

*partially-ordered-with*<T, U>;~~requires(const remove_reference_t<T>& t,~~~~const remove_reference_t<U>& u) {~~~~{ t < u } -> boolean;~~~~{ t > u } -> boolean;~~~~{ t <= u } -> boolean;~~~~{ t >= u } -> boolean;~~~~{ u < t } -> boolean;~~~~{ u > t } -> boolean;~~~~{ u <= t } -> boolean;~~~~{ u >= t } -> boolean;~~~~};~~[…]