三方比較演算子について
C++20で追加予定の比較演算子<=>
。
比較演算子だがbool値を取らない。
主な用途
三方比較演算子をオーバーロードすることで他6種の比較演算子が自動生成される……わけではないらしく、
実際は==
と!=
が生成されないため、==
のオーバーロードも必要。
三方比較演算子をオーバーロードする際の戻り値の型は以下の三種。
-
std::strong_ordering
==
が代入可能性を満たしている。
==
が真なら値は全く同じという解釈で大体あっていると思う。 -
std::weak_ordering
==
が代入可能性を満たしているとは限らない場合に使うっぽい。
例えば文字列比較で大文字小文字を区別したくないときの三方比較演算子はこの型を返すべき。 -
std::partial_ordering
唯一比較結果なし(unordered)の場合がある型
unorderedのときはすべての比較演算が偽になる模様。
また三方比較演算子は符号なし整数型と符号付整数型の比較ができないらしいので制約でも使えそう。
以下コード例
#include <iostream>
// オーバーロードの例
struct A{
int a = 0;
auto operator<=>(const A& value) const -> std::strong_ordering{
return this->a <=> value.a;
}
};
// 制約に三方比較演算子を使用する
template <class T, class U>
requires requires (const T& x, const U& y) { x <=> y; }
bool myless(const T& t, const U& u){
// return t < u; // t<u がdeleteされるとエラーになるので念の為こちらは使用しない
return (t<=>u) < 0;
}
// 通常の比較演算子の場合
template <class T, class U>
requires requires (const T& x, const U& y) { x < y; }
bool myless2(const T& t, const U& u){
return t<u;
}
int main()
{
A a1{.a=-1},a2{.a=1};
std::cout << std::boolalpha;
std::cout << (a1 < a2) << std::endl; // true
std::cout << myless(a1,a2) << std::endl; // true
std::cout << (-1 < 1u) << std::endl; // false
//std::cout << myless(-1,1u) << std::endl; // コンパイルエラー
std::cout << myless2(-1,1u) << std::endl; // false
}