std::experimental::ranges::StrictTotallyOrdered,std::experimental::ranges::StrictTotallyOrderedWith
定义在头文件 <experimental/ranges/concepts> 中 |
||
template< class T > concept bool StrictTotallyOrdered = |
(1) | (范围 TS) |
template< class T, class U > concept bool StrictTotallyOrderedWith = |
(2) | (范围 TS) |
StrictTotallyOrdered<T>
概念指定了对 T
的比较运算符 ==, !=, <, >, <=, >=
生成的结果与 T
上的 严格全序 一致。仅当给定类型为 const std::remove_reference_t<T> 的左值 a
、b
和 c
时,StrictTotallyOrdered<T>
才满足。
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)
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))
[edit] 等值保持
如果表达式在给定相同输入的情况下产生相同的输出,则该表达式称为“等值保持”表达式。
- 表达式的输入包括其操作数。
- 表达式的输出包括其结果和所有被表达式修改的操作数(如果有)。
所有需要等值保持的表达式都需要是“稳定”的:如果在没有显式干预修改这些输入对象的情况下,对同一个输入对象进行两次相同表达式的计算,必须产生相同的输出。
除非另有说明,否则所有用于“requires-expression”的表达式都需要等值保持且稳定,并且表达式的计算只能修改其非常数操作数。常数操作数不得修改。
[edit] 隐式表达式变体
一个“requires-expression”使用一个表达式,该表达式对于某些常数左值操作数是非修改的,它也隐式地要求该表达式的其他变体,这些变体接受非常数左值或(可能为常数的)右值作为给定操作数,除非这样的表达式变体被明确要求且具有不同的语义。这些“隐式表达式变体”必须满足与声明表达式相同的语义要求。实现验证变体语法的程度是不确定的。