std::totally_ordered, std::totally_ordered_with
ヘッダ <concepts> で定義 | ||
template<class T> concept totally_ordered = | (1) | (C++20以上) |
template<class T, class U> concept totally_ordered_with = | (2) | (C++20以上) |
totally_ordered<T>
は、 T
に対する比較演算子 ==,!=,<,>,<=,>=
が T
に対する狭義全順序と一貫性のある結果を返すことを表します。 totally_ordered<T>
は、 conststd::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)
totally_ordered_with<T, U>
は、 T
および U
(混在しても構いません) の被演算子に対する比較演算子 ==,!=,<,>,<=,>=
が狭義全順序と一貫性のある結果を返すことを表します。 混在した被演算子の比較はその共通型に変換された被演算子の比較と同等の結果を返します。 形式的には、 totally_ordered_with<T, U>
は、 conststd::remove_reference_t<T> 型の任意の左辺値 t
および conststd::remove_reference_t<U> 型の任意の左辺値 u
が与えられたとき、 C
を std::common_reference_t<conststd::remove_reference_t<T>&, conststd::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))
[編集] 等しさの維持
等しい入力を与えると等しい出力が得られる場合、その式は等しさを維持します。
- 式への入力がその被演算子から構成される。
- 式の出力がその結果およびその式によって変更されるすべての被演算子 (もしあれば) から構成される。
等しさを維持することが要求されるすべての式は、さらに安定であることも要求されます。 同じ入力オブジェクトを用いたそのような式の2回の評価は、間にそれらの入力オブジェクトの変更が明示的に挟まれなければ、等しい出力が得られなければなりません。
特に明記されない限り、 requires 式で使用されるすべての式は、等しさを維持することと安定であることが要求され、式の評価は非定数の被演算子のみを変更することができます。 定数である被演算子は変更してはなりません。
[編集] 暗黙の式のバリエーション
何らかの定数左辺値の被演算子に対して変更しない式を使用する requires 式は、そのような式のバリエーションが異なるセマンティクスで明示的に要求されなければ、与えられた被演算子に対して非定数左辺値または (定数かもしれない) 右辺値を受理するその式の追加のバリエーションも暗黙に要求します。 これらの暗黙の式のバリエーションは、宣言された式のセマンティクスの要件を満たさなければなりません。 処理系がバリエーションの構文を検証する範囲は未規定です。