# std::strict_weak_order

From cppreference.com
< cpp‎ | concepts

Defined in header `<concepts>` |  |
template< class R, class T, class U > concept strict_weak_order = std::relation <R, T, U>; |  | (since C++20)

The concept `strict_weak_order<R, T, U>` specifies that the `relation` `R` imposes a strict weak ordering on its arguments.

### Semantic requirements

A relation r is a strict weak ordering if

- it is irreflexive: for all x, r(x, x) is false;
- it is transitive: for all a, b and c, if r(a, b) and r(b, c) are both true then r(a, c) is true;
- let e(a, b) be !r(a, b) && !r(b, a), then e is transitive: e(a, b) && e(b, c) implies e(a, c).

Under these conditions, it can be shown that e is an equivalence relation, and r induces a strict total ordering on the equivalence classes determined by e.

### Notes

The distinction between `relation` and `strict_weak_order` is purely semantic.

### References

- C++23 standard (ISO/IEC 14882:2024):

  - 18.7.7 Concept `strict_weak_order` [concept.strictweakorder]

- C++20 standard (ISO/IEC 14882:2020):

  - 18.7.7 Concept `strict_weak_order` [concept.strictweakorder]

### See also

- LessThanComparable

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/concepts/strict_weak_order&oldid=177902"