💨

宇宙船演算子

2024/09/18に公開

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 < BA > BA == Bのそれぞれの結果が分かるため、便利ですね。
カスタムのクラスで比較演算子をオーバーロードする際も、C++20までは<>==演算子をそれぞれオーバーロードしないといけなかったのですが、C++20からは<=>演算子だけオーバーロードすればいいようになります。

少し細かい話になりますが、<=>演算子が返す値は実はクラス型になっていて、比較する値の型によって、以下の3つのタイプになります。

  1. std::strong_ordering
    • 全順序関係の比較のケース。例えば、int型の比較では、同じ値のみ等価の扱いになります。
  2. std::weak_ordering
    • 弱順序関係の比較のケース。例えば、大文字と小文字を区別しない比較では、"foo""FOO"は別の値なのに等価の扱いになります。
  3. std::partial_ordering
    • 半順序関係の比較のケース。例えば、float型の比較では、NAN(Not A Number)という非数を表す他の値と比較できない値が存在します。

std::partial_orderingが返される場合は、4つ目のABはそもそも比較できないというケースが存在します。

スタートレックの宇宙船に似ているため「宇宙船演算子」(spaceship operator)という名前になったようですが、スタートレックが詳しくない人はあんまりピンと来ないと思います。でも「三項演算子」(three-way comparison operator)よりは覚えやすいですね。


|cpp記事一覧へのリンク|

Discussion