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
上の
狭義全順序
と整合性のある結果を返すことを規定する。
StrictTotallyOrdered<T>
が満たされるのは、型
const
std::
remove_reference_t
<
T
>
の左辺値
a
,
b
,
c
が与えられたときに以下の条件が成立する場合に限る:
- bool ( a < b ) , bool ( a > b ) , bool ( a == b ) のうち丁度1つが 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 ) )
等価性保存
式は、等しい入力が与えられた場合に等しい出力をもたらす場合、 equality preserving であると言います。
- 式への入力は、そのオペランドで構成されます。
- 式からの出力は、その結果と、式によって変更されたすべてのオペランド(存在する場合)で構成されます。
等価性を保持することが要求されるすべての式は、さらに 安定性 が要求されます:同じ入力オブジェクトに対するそのような式の2回の評価は、それらの入力オブジェクトに対する明示的な変更がない限り、等しい出力を持たなければなりません。
特に明記されていない限り、 requires式 で使用される各式は、等価性を保存し安定していることが要求され、式の評価は非定数オペランドのみを変更できます。定数オペランドは変更してはなりません。
暗黙的な式のバリエーション
requires-expression は、特定の定数左辺値オペランドに対して非変更的な式を使用する場合、そのオペランドに対して非定数左辺値または(場合によっては定数の)右辺値を受け入れる式の追加バリエーションも暗黙的に要求します。ただし、異なるセマンティクスを持つ式バリエーションが明示的に要求されている場合は除きます。これらの 暗黙的な式バリエーション は、宣言された式と同じセマンティック要件を満たさなければなりません。実装がこれらのバリエーションの構文をどこまで検証するかは未規定です。