std::three_way_comparable, std::three_way_comparable_with
| ヘッダ <compare> で定義 |
||
| template< class T, class Cat = std::partial_ordering > concept three_way_comparable = |
(1) | (C++20以降) |
| template< class T, class U, class Cat = std::partial_ordering > concept three_way_comparable_with = |
(2) | (C++20以降) |
| template< class T, class Cat > concept __ComparesAs = |
(3) | (説明用*) |
std::three_way_comparable は、T の三方比較演算子 <=> が Cat によって示される比較カテゴリと一貫した結果を生成することを指定します。std::three_way_comparable_with は、(型が混在している可能性のある) T と U オペランドに対する三方比較演算子 <=> が Cat によって示される比較カテゴリと一貫した結果を生成することを指定します。混在したオペランドの比較は、オペランドを共通型に変換して比較するのと同等の結果を生成します。__WeaklyEqualityComparableWith, __PartiallyOrderedWith, および __ComparisonCommonTypeWith は、説明専用のコンセプトです。equality_comparable および totally_ordered の説明を参照してください。
目次 |
[編集] 意味論的要件
これらのコンセプトは、それらが満たされ、かつそれらが含むすべてのコンセプトがモデル化されている場合にのみモデル化される。
T と Cat が std::three_way_comparable<T, Cat> をモデルするのは、型 const std::remove_reference_t<T> の左辺値 a と b が与えられた場合に、以下の条件が真であるときだけです。- (a <=> b == 0) == bool(a == b),
- (a <=> b != 0) == bool(a != b),
- ((a <=> b) <=> 0) と (0 <=> (b <=> a)) は等しく、
- bool(a > b) == bool(b < a),
- bool(a >= b) == !bool(a < b),
- bool(a <= b) == !bool(b < a),
- (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をモデルします。
T、U、および Cat が std::three_way_comparable_with<T, U, Cat> をモデルするのは、以下が与えられた場合のみです。-
tとt2は、それぞれ型 const std::remove_reference_t<T> と std::remove_reference_t<T> の異なる等しいオブジェクトを表す左辺値であり、 -
uとu2は、それぞれ型 const std::remove_reference_t<U> と std::remove_reference_t<U> の異なる等しいオブジェクトを表す左辺値です。
C を std::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&> とし、式 E と型 C が与えられた場合、CONVERT_TO<C>(E) は以下のようになります。
|
(C++23まで) |
|
(C++23から) |
以下の条件が真である。
- 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(CONVERT_TO<C>(t2) <=> CONVERT_TO<C>(u2)),
- (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> をモデルします。
[編集] 等価性保持
標準ライブラリのコンセプトのrequires式で宣言された式は、(特に明記されていない限り)等価性保持である必要があります。
[編集] 暗黙の式バリエーション
一部の定数左辺値オペランドに対して非変更的である式を使用するrequires式は、暗黙の式バリエーションも必要とする。
[編集] 関連項目
| 演算子==が同値関係であることを規定する (コンセプト) | |
| その型の比較演算子が全順序をもたらすことを規定する (コンセプト) |