💨
宇宙船演算子
C++20 で<=>と書く宇宙船演算子が追加されました。
#include <compare>
const auto result(A <=> B);
if (result < 0)
{
std::cout << "A < B" << std::endl;
}
else if (result > 0)
{
std::cout << "A > B" << std::endl;
}
else if (result == 0)
{
std::cout << "A == B" << std::endl;
}
else // A と B は比較できないケース
{
std::cout << "A and B cannot be compared" << std::endl;
}
一つの演算子でA < BとA > BとA == Bのそれぞれの結果が分かるため、便利ですね。
カスタムのクラスで比較演算子をオーバーロードする際も、C++20までは<、>、==演算子をそれぞれオーバーロードしないといけなかったのですが、C++20からは<=>演算子だけオーバーロードすればいいようになります。
少し細かい話になりますが、<=>演算子が返す値は実はクラス型になっていて、比較する値の型によって、以下の3つのタイプになります。
-
std::strong_ordering- 全順序関係の比較のケース。例えば、
int型の比較では、同じ値のみ等価の扱いになります。
- 全順序関係の比較のケース。例えば、
-
std::weak_ordering- 弱順序関係の比較のケース。例えば、大文字と小文字を区別しない比較では、
"foo"と"FOO"は別の値なのに等価の扱いになります。
- 弱順序関係の比較のケース。例えば、大文字と小文字を区別しない比較では、
-
std::partial_ordering- 半順序関係の比較のケース。例えば、
float型の比較では、NAN(Not A Number)という非数を表す他の値と比較できない値が存在します。
- 半順序関係の比較のケース。例えば、
std::partial_orderingが返される場合は、4つ目のAとBはそもそも比較できないというケースが存在します。
スタートレックの宇宙船に似ているため「宇宙船演算子」(spaceship operator)という名前になったようですが、スタートレックが詳しくない人はあんまりピンと来ないと思います。でも「三項演算子」(three-way comparison operator)よりは覚えやすいですね。
Discussion