std::compare_weak_order_fallback
| ヘッダ <compare> で定義 |
||
| inline namespace /* 未指定 */ { inline constexpr /* 未指定 */ |
(C++20以降) | |
| 呼び出しシグネチャ |
||
| template< class T, class U > requires /* 以下を参照 */ |
(C++20以降) | |
サブ式 t と u の3項比較を行い、演算子 <=> が利用できない場合でも、std::weak_ordering 型の結果を生成します。
もし std::decay_t<T> と std::decay_t<U> が同じ型である場合、std::compare_weak_order_fallback(t, u) は、式として同値です。
- std::weak_order(t, u)、もしそれが well-formed な式であれば。そうでなければ、
- t == u ? std::weak_ordering::equivalent :
t < u ? std::weak_ordering::less :
std::weak_ordering::greater、もし式 t == u と t < u が両方とも well-formed であり、decltype(t == u) と decltype(t < u) のそれぞれが boolean-testable をモデル化し、ただし t と u は一度だけ評価されます。
それ以外の場合は、std::compare_weak_order_fallback(t, u) は ill-formed であり、テンプレートインスタンス化の直接のコンテキストに現れる場合、置換失敗につながる可能性があります。
目次 |
カスタマイゼーションポイントオブジェクト
std::compare_weak_order_fallback という名前は、カスタマイズポイントオブジェクトを指します。これは、リテラルな semiregular クラス型の const な 関数オブジェクトです。説明のために、その型の cv-unqualified バージョンは __compare_weak_order_fallback_fn と表記されます。
__compare_weak_order_fallback_fn のすべてのインスタンスは等価です。同じ引数に対して異なる __compare_weak_order_fallback_fn 型のインスタンスを呼び出す効果は、インスタンスを表す式が lvalue か rvalue か、cv 修飾されているか否かに関わらず同等です(ただし、volatile 修飾されたインスタンスは呼び出し可能である必要はありません)。したがって、std::compare_weak_order_fallback は自由にコピーでき、そのコピーは相互に交換可能に使用できます。
型のセット Args... が与えられた場合、もし std::declval<Args>()... が上記の std::compare_weak_order_fallback への引数の要件を満たす場合、__compare_weak_order_fallback_fn は以下をモデル化します。
- std::invocable<__compare_weak_order_fallback_fn, Args...>,
- std::invocable<const __compare_weak_order_fallback_fn, Args...>,
- std::invocable<__compare_weak_order_fallback_fn&, Args...>、そして
- std::invocable<const __compare_weak_order_fallback_fn&, Args...>.
それ以外の場合、__compare_weak_order_fallback_fn の関数呼び出し演算子はオーバーロード解決に参加しません。
[編集] 例
#include <compare> #include <iostream> // does not support <=> struct Rational_1 { int num; int den; // > 0 }; inline constexpr bool operator<(Rational_1 lhs, Rational_1 rhs) { return lhs.num * rhs.den < rhs.num * lhs.den; } inline constexpr bool operator==(Rational_1 lhs, Rational_1 rhs) { return lhs.num * rhs.den == rhs.num * lhs.den; } // supports <=> struct Rational_2 { int num; int den; // > 0 }; inline constexpr std::weak_ordering operator<=>(Rational_2 lhs, Rational_2 rhs) { return lhs.num * rhs.den <=> rhs.num * lhs.den; } inline constexpr bool operator==(Rational_2 lhs, Rational_2 rhs) { return lhs <=> rhs == 0; } void print(int id, std::weak_ordering value) { std::cout << id << ") "; if (value == 0) std::cout << "equal\n"; else if (value < 0) std::cout << "less\n"; else std::cout << "greater\n"; } int main() { Rational_1 a{1, 2}, b{3, 4}; // print(0, a <=> b); // does not work print(1, std::compare_weak_order_fallback(a, b)); // works, defaults to < and == Rational_2 c{6, 5}, d{8, 7}; print(2, c <=> d); // works print(3, std::compare_weak_order_fallback(c, d)); // works Rational_2 e{2, 3}, f{4, 6}; print(4, e <=> f); // works print(5, std::compare_weak_order_fallback(e, f)); // works }
出力
1) less 2) greater 3) greater 4) equal 5) equal
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2114 (P2167R3) |
C++20 | [編集] 不具合報告 フォールバックメカニズムは、戻り値の型がboolに変換可能であることを要求していました。 |
制約が強化されました。 |
[編集] 関連項目
| (C++20) |
三方比較を行い、std::weak_ordering 型の結果を生成する(カスタマイゼーションポイントオブジェクト) |