std::three_way_comparable, std::three_way_comparable_with
ヘッダ <compare> で定義 | ||
template<class T, class U> concept __PartiallyOrderedWith = // 説明専用 | (1) | (C++20以上) |
template<class T, class Cat> concept __ComparesAs = // 説明専用 | (2) | (C++20以上) |
template<class T, class Cat = std::partial_ordering> concept three_way_comparable = | (3) | (C++20以上) |
template<class T, class U, class Cat = std::partial_ordering> concept three_way_comparable_with = | (4) | (C++20以上) |
__PartiallyOrderedWith<T, U>
は T
型のオブジェクトと U
型のオブジェクトが <
、 >
、 <=
、および >=
を用いてお互いに (いずれの順序でも) 半順序で比較でき、その比較の結果が一貫していることを指定します。T
および U
は、以下の内容を満たす場合に限り、 __PartiallyOrderedWith<T, U>
をモデル化します。 - conststd::remove_reference_t<T> 型の左辺値
t
- conststd::remove_reference_t<U> 型の左辺値
u
が与えられたとき、以下が真である。
- t < u、 t <= u、 t > u、 t >= u、 u < t、 u <= t、 u > t、および u >= t が同じ定義域を持つ
- bool(t < u)==bool(u > t)
- bool(u < t)==bool(t > u)
- bool(t <= u)==bool(u >= t)
- bool(u <= t)==bool(t >= u)
three_way_comparable<T, Cat>
は T
に対する三方比較演算子 <=>
が Cat
の表す比較カテゴリと矛盾しない結果を生成することを指定します。 T
と Cat
は、conststd::remove_reference_t<T> 型の左辺値 a
および b
が与えられたとき、以下が真である場合に限り、 three_way_comparable<T, Cat>
をモデル化します。
- (a <=> b ==0)==bool(a == b)
- (a <=> b !=0)==bool(a != b)
- ((a <=> b)<=>0) と (0<=>(b <=> a)) が等しい
- 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)
Cat
が std::strong_equality に変換可能であればT
が equality_comparable をモデル化するCat
が std::partial_ordering に変換可能であれば以下が成り立つ- (a <=> b <0)==bool(a < b)
- (a <=> b >0)==bool(a > b)
- (a <=> b <=0)==bool(a <= b)
- (a <=> b >=0)==bool(a >= b)
Cat
が std::strong_ordering に変換可能であればT
が totally_ordered をモデル化する
three_way_comparable_with<T, U, Cat>
は T
と U
の被演算子 (混在しても構いません) に対する三方比較演算子 <=>
が Cat
の表す比較カテゴリと矛盾しない結果を生成することを指定します。 混在した被演算子の比較はそれらの共通の型に変換した被演算子を比較したのと同等の結果を生成します。 形式的には、 T
、 U
、および Cat
は、以下の内容を満たす場合に限り、 three_way_comparable_with<T, U, Cat>
をモデル化します。
- 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>&> としたとき、以下が真である。
- t <=> u と u <=> t が同じ定義域を持つ。
- ((t <=> u)<=>0) と (0<=>(u <=> t)) が等しい
- (t <=> u ==0)==bool(t == u)
- (t <=> u !=0)==bool(t != u)
- Cat(t <=> u)== Cat(C(t)<=> C(u))
Cat
が std::strong_equality に変換可能であればT
とU
が std::equality_comparable_with<T, U> をモデル化するCat
が std::partial_ordering に変換可能であれば以下が成り立つ- (t <=> u <0)==bool(t < u)
- (t <=> u >0)==bool(t > u)
- (t <=> u <=0)==bool(t <= u)
- (t <=> u >=0)==bool(t >= u)
Cat
が std::strong_ordering に変換可能であればT
とU
が std::totally_ordered_with<T, U> をモデル化する
ただし __WeaklyEqualityComparableWith
は equality_comparable でも使用される説明専用コンセプトです。
[編集] 等しさの維持
等しい入力を与えると等しい出力が得られる場合、その式は等しさを維持します。
- 式への入力がその被演算子から構成される。
- 式の出力がその結果およびその式によって変更されるすべての被演算子 (もしあれば) から構成される。
等しさを維持することが要求されるすべての式は、さらに安定であることも要求されます。 同じ入力オブジェクトを用いたそのような式の2回の評価は、間にそれらの入力オブジェクトの変更が明示的に挟まれなければ、等しい出力が得られなければなりません。
特に明記されない限り、 requires 式で使用されるすべての式は、等しさを維持することと安定であることが要求され、式の評価は非定数の被演算子のみを変更することができます。 定数である被演算子は変更してはなりません。
[編集] 暗黙の式のバリエーション
何らかの定数左辺値の被演算子に対して変更しない式を使用する requires 式は、そのような式のバリエーションが異なるセマンティクスで明示的に要求されなければ、与えられた被演算子に対して非定数左辺値または (定数かもしれない) 右辺値を受理するその式の追加のバリエーションも暗黙に要求します。 これらの暗黙の式のバリエーションは、宣言された式のセマンティクスの要件を満たさなければなりません。 処理系がバリエーションの構文を検証する範囲は未規定です。
[編集]関連項目
演算子 == が同値関係であることを指定します (コンセプト) | |
型の比較演算子が全順序を与えることを指定します (コンセプト) |