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