namespace std {
inline namespace /*unspecified*/ {
inline constexpr /*unspecified*/ compare_weak_order_fallback = /*unspecified*/;
}
}
概要
compare_weak_order_fallback
は2つの引数を受け取り、それらを弱順序の上で比較する関数オブジェクトである。
weak_order
が使用できない場合でも、引数型が< ==
両演算子を使用可能であればそれを用いて比較を行う。
効果
compare_weak_order_fallback(a, b)
のように呼び出された時、以下のいずれかと等価(上から順に考慮される)
-
weak_order(a, b)
が呼び出し可能ならばweak_order(a, b)
-
a == b
、a < b
の両方の演算子が使用可能でありその戻り値型がbool
へ変換可能ならば、以下の式
a == b ? weak_ordering::equivalent : a < b ? weak_ordering::less : weak_ordering::greater
-
それ以外の場合、呼び出しは不適格。
戻り値
呼び出しが適格ならば、比較結果を表すweak_ordering
の値。
例外
上記「効果」節のそれぞれのケース毎に
- --
- 呼び出される
weak_order(a, b)
が例外を送出するかに従う。 - 呼び出される
a < b
およびa == b
が例外を送出するかに従う。
定数式に評価される条件
上記「効果」節のそれぞれのケース毎に
- --
- 呼び出される
weak_order(a, b)
が定数評価可能であるかに従う。 - 呼び出される
a < b
およびa == b
が定数評価可能であるかに従う。
カスタマイゼーションポイント
上記「効果」節2,3のケースでは、ユーザー定義の< ==
演算子を定義、もしくはweak_order()
へアダプトしておくことによって実行される比較をカスタマイズすることができる。
- --
- 引数
a, b
の型T
をweak_order
にアダプトしておく。 - 引数
a, b
の型T
に対して、使用可能な< ==
演算子を定義しておく。
ただし、どのケースにおいてもその戻り値型はweak_ordering
に変換可能でなければならない。
例
#include <iostream>
#include <compare>
#include <limits>
struct legacy {
double v = 0.0;
friend bool operator==(const legacy& lhs, const legacy& rhs) {
return lhs.v == rhs.v;
}
friend bool operator<(const legacy& lhs, const legacy& rhs) {
return lhs.v < rhs.v;
}
};
int main()
{
std::cout << std::boolalpha;
legacy l1 = {+0.0}, l2 = {-0.0}, l3 = {-std::numeric_limits<double>::quiet_NaN()}, l4 = {std::numeric_limits<double>::quiet_NaN()};
std::cout << (std::compare_weak_order_fallback(l1, l2) < 0) << std::endl;
std::cout << (std::compare_weak_order_fallback(l1, l2) == 0) << std::endl;
std::cout << "\n";
auto comp1 = std::compare_weak_order_fallback(l1, l4);
std::cout << (comp1 == 0) << std::endl;
std::cout << (comp1 != 0) << std::endl;
std::cout << (comp1 < 0) << std::endl;
std::cout << (comp1 > 0) << std::endl; //比較不能がgreaterと判定される
std::cout << "\n";
auto comp2 = std::compare_weak_order_fallback(l3, l4);
std::cout << (comp2 == 0) << std::endl;
std::cout << (comp2 != 0) << std::endl;
std::cout << (comp2 < 0) << std::endl;
std::cout << (comp2 > 0) << std::endl; //比較不能がgreaterと判定される
}
出力
false
true
false
true
false
true
false
true
false
true
バージョン
言語
- C++20
処理系
- Clang: ??
- GCC: 10.1 ✅
- Visual C++: ??