std::experimental::ranges:: StrictTotallyOrdered, std::experimental::ranges:: StrictTotallyOrderedWith
|
template
<
class
T
>
concept
bool
StrictTotallyOrdered
=
|
(1) | (ranges TS) |
|
template
<
class
T,
class
U
>
concept
bool
StrictTotallyOrderedWith
=
|
(2) | (ranges 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
操作数执行的比较运算符
==,!=,<,>,<=,>=
产生的结果与严格全序一致。混合操作数的比较结果应等价于将操作数转换为其公共类型后的比较结果。
形式化定义中,仅当给定类型为
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
>
&
>
时满足以下条件,
StrictTotallyOrderedWith<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 ) )
等值保持性
表达式若在给定相等输入时产生相等输出,则称其具有 等值保持性 。
- 表达式的输入由其操作数构成。
- 表达式的输出由其结果及所有被该表达式修改的操作数(如有)构成。
所有要求保持相等性的表达式必须进一步满足 稳定性 要求:对此类表达式进行两次求值时,若输入对象相同且期间未显式修改这些输入对象,则必须产生相等的输出结果。
除非另有说明,在 要求表达式 中使用的每个表达式都必须保持相等性且稳定,且该表达式的求值只能修改其非常量操作数。常量操作数不得被修改。
隐式表达式变体
一个使用对某个常量左值操作数进行非修改性表达式的 要求表达式 ,会隐式要求该表达式接受非常量左值或(可能为常量的)右值作为给定操作数的附加变体,除非已通过具有不同语义的显式要求排除了这类表达式变体。这些 隐式表达式变体 必须满足已声明表达式的相同语义要求。实现对这些变体语法验证的程度未作规定。