💨
宇宙船演算子
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