# std::experimental::ranges::StrictTotallyOrdered, std::experimental::ranges::StrictTotallyOrderedWith

< cpp‎ | experimental‎ | ranges

定义于头文件 `<experimental/ranges/concepts>` |  |
template <class T> concept bool StrictTotallyOrdered = ranges::EqualityComparable<T> && requires(const std::remove_reference_t<T>& a, const std::remove_reference_t<T>& b) { { a < b } -> ranges::Boolean&&; { a > b } -> ranges::Boolean&&; { a <= b } -> ranges::Boolean&&; { a >= b } -> ranges::Boolean&&; }; | (1) | (范围 TS)
template <class T, class U> concept bool StrictTotallyOrderedWith = ranges::StrictTotallyOrdered<T> && ranges::StrictTotallyOrdered<U> && ranges::CommonReference< const std::remove_reference_t<T>&, const std::remove_reference_t<U>&> && ranges::StrictTotallyOrdered< ranges::common_reference_t< const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>> && ranges::EqualityComparableWith<T, U> && requires(const std::remove_reference_t<T>& t, const std::remove_reference_t<U>& u) { { t < u } -> ranges::Boolean&&; { t > u } -> ranges::Boolean&&; { t <= u } -> ranges::Boolean&&; { t >= u } -> ranges::Boolean&&; { u < t } -> ranges::Boolean&&; { u > t } -> ranges::Boolean&&; { u <= t } -> ranges::Boolean&&; { u >= t } -> ranges::Boolean&&; }; | (2) | (范围 TS)

1) 概念 `StrictTotallyOrdered<T>` 指定 `T` 上的比较运算符 `==,!=,<,>,<=,>=` 产出的结果与 `T` 上的严格全序一致。

`StrictTotallyOrdered<T>` 仅若符合下列条件才得到满足。给定 const std::remove_reference_t<T> 类型左值 `a` 、 `b` 和 `c` ：

- bool(a < b) 、 bool(a > b) 与 bool(a == b) 有且只有一个为 true ；
- 若 bool(a < b) 与 bool(b < c) 均为 true ，则 bool(a < c) 为 true ；
- bool(a > b) == bool(b < a)
- bool(a >= b) == !bool(a < b)
- bool(a <= b) == !bool(b < a)

2) 概念 `StrictTotallyOrderedWith<T, U>` 指定（可混合的） `T` 与 `U` 运算数上的比较运算符 `==,!=,<,>,<=,>=` 产出的结果与严格全序一致。比较混合的运算数产出的结果等价于比较转换到其共用类型的运算数。

正式而言， `StrictTotallyOrderedWith<T, U>` 仅若符合下列条件才得到满足。给定任何 const std::remove_reference_t<T> 类型左值 `t` 与任何 const std::remove_reference_t<U> 类型左值 `u` ，并令 `C` 为 ranges::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&> ：

- bool(t < u) == bool(C(t) < C(u))
- bool(t > u) == bool(C(t) > C(u))
- bool(t <= u) == bool(C(t) <= C(u))
- bool(t >= u) == bool(C(t) >= C(u))
- bool(u < t) == bool(C(u) < C(t))
- bool(u > t) == bool(C(u) > C(t))
- bool(u <= t) == bool(C(u) <= C(t))
- bool(u >= t) == bool(C(u) >= C(t))

### 相等性保持

若表达式对给定的相等输入产生相等输出，则它保持相等性。

- 表达式的输入由其运算数组成。
- 表达式的输出由其结果和表达式所修改的所有运算数（若存在）组成。

进一步要求每个要求保持相等性的表达式都稳定：这种表达式带相同输入对象的二次求值必须拥有相等的输出，而无任何对这些输入对象的显式中间修改。

除非另外提醒，每个用于 requires 表达式中的表达式都要求保持相等性且稳定，而表达式的求值必须只修改其非常运算数。必须不修改常运算数。

### 隐式表达式变种

使用不修改某 const 左值运算数的表达式的 requires 表达式亦隐式要求该表达式的额外变种对给定运算数接受非 const 左值或（可为 const 的）右值，除非以有区别的语义显式要求这种表达式变种。这些隐式表达式变种必须符合与声明的表达式的相同的语义。不指定实现以何种程度校验变种的语法。