概要
<compare>
ヘッダでは三方比較演算子<=>
の戻り値型である比較カテゴリ型、及び一貫比較に関連するコンセプトや関数等を提供する。
比較カテゴリ型を返す<=>
を利用する際は本ヘッダのインクルードは必須である。
本ヘッダはフリースタンディング環境でも提供される。
代入可能性(substitutability)
代入可能性とは、a == b
ならばf(a) == f(b)
となる性質の事である。なお、ここでのf()
は内部状態や副作用を持たず入力のアクセス可能な要素のみによって出力が決まる関数で、pure
な関数と呼ばれるものである。
strong_ordering
を返す<=>
における同値比較がこの性質を満たしていることを表明する。このカテゴリを返す<=>
を実装する際はこれらの性質を満たすように実装する必要がある。
数学の言葉ではこの性質は代入原理(Substitution property)と呼ばれ、これを満たす同値関係のことを特に相当関係と呼ぶ。
また、相当関係による同値類(ある集合上でa == b
となる要素を集めて出来る集合)を考れば、それら同値類のどれを取ってもその要素はただ1つだけとなる。その意味から、相当関係は最も細かい同値関係とも呼ばれる。
比較カテゴリ型
名前 | 説明 | 対応バージョン |
---|---|---|
partial_ordering |
半順序関係を表す比較カテゴリ型 | C++20 |
weak_ordering |
弱順序関係を表す比較カテゴリ型 | C++20 |
strong_ordering |
全順序関係を表す比較カテゴリ型 | C++20 |
三方比較の結果型
名前 | 説明 | 対応バージョン |
---|---|---|
common_comparison_category |
指定された全ての型の共通比較カテゴリ型を求める | C++20 |
compare_three_way_result |
指定された型の間での<=> による比較結果の型を求める |
C++20 |
コンセプト
名前 | 説明 | 対応バージョン |
---|---|---|
three_way_comparable |
指定された型が<=> による比較が可能であり、結果が指定した比較カテゴリ型に変換可能である |
C++20 |
three_way_comparable_with |
指定された型の間で<=> による比較が可能であり、結果が指定した比較カテゴリ型に変換可能である |
C++20 |
名前付きの比較関数
名前 | 説明 | 対応バージョン |
---|---|---|
is_eq |
a <=> b の比較結果がa == b であるかを取得する |
C++20 |
is_neq |
a <=> b の比較結果がa != b であるかを取得する |
C++20 |
is_lt |
a <=> b の比較結果がa < b であるかを取得する |
C++20 |
is_lteq |
a <=> b の比較結果がa <= b であるかを取得する |
C++20 |
is_gt |
a <=> b の比較結果がa > b であるかを取得する |
C++20 |
is_gteq |
a <=> b の比較結果がa >= b であるかを取得する |
C++20 |
比較関数オブジェクト
名前 | 説明 | 対応バージョン |
---|---|---|
compare_three_way |
ポインタ比較時のみ実装定義の狭義全順序によって、その他の場合はデフォルトの三方比較を行う | C++20 |
strong_order |
全順序による三方比較を行う(カスタマイゼーションポイントオブジェクト) | C++20 |
weak_order |
弱順序による三方比較を行う(カスタマイゼーションポイントオブジェクト) | C++20 |
partial_order |
半順序による三方比較を行う(カスタマイゼーションポイントオブジェクト) | C++20 |
compare_strong_order_fallback |
<=> が無い場合でも< == を用いて全順序による三方比較を行う(カスタマイゼーションポイントオブジェクト) |
C++20 |
compare_weak_order_fallback |
<=> が無い場合でも< == を用いて弱順序による三方比較を行う(カスタマイゼーションポイントオブジェクト) |
C++20 |
compare_partial_order_fallback |
<=> が無い場合でも< == を用いて半順序による三方比較を行う(カスタマイゼーションポイントオブジェクト) |
C++20 |
バージョン
言語
- C++20
処理系
- Clang: 8.0 ✅
- GCC: 10.1 ✅
- Visual C++: 2019 ✅