0Pricing
C++ Academy · レッスン

三方比較演算子(C++20)

宇宙船演算子 を使って、簡潔で一貫した比較を実現します。

「三方比較演算子(C++20)」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

宇宙船演算子<=>

C++20では三方比較演算子<=>が導入されました。1つの演算子で、6種類すべての関係演算子を生成するために必要な情報をコンパイラーに与えられます。

戻り値の型:3つのカテゴリ

戻り値の型は、順序付けの強さによって決まります:

  • std::strong_ordering — 等価な値を明確に区別できる
  • std::weak_ordering — 等価だが区別可能(大文字と小文字を区別しない比較など)
  • std::partial_ordering — 比較できない値がある(NaNなど)

デフォルト比較

最も一般的なパターンは、メンバーを辞書順に比較する<=>の生成をコンパイラーに依頼することです。

struct Point {
    int x;
    int y;
    auto operator<=>(const Point& other) const = default;
};

Point a{1, 2}, b{1, 3};
bool less = (a < b);     // true — auto-generated

6種類すべてを自動生成

<=>をデフォルト化すると、==もデフォルト化されます。これらを組み合わせることで、!=、<、<=、>、>=も生成され、1行ですべての6種類を定義できます。

カスタム<=>の実装

独自の比較ロジックが必要な場合は、本文を手動で記述します。

std::strong_ordering operator<=>(const Person& other) const {
    if (auto c = name <=> other.name; c != 0) return c;
    return age <=> other.age;
}

結果の使用

<=>の結果は、実際に必要な真偽判定のためにリテラルの0と比較できます。

if ((a <=> b) < 0)  std::cout << "a less\n";
if ((a <=> b) == 0) std::cout << "equal\n";
if ((a <=> b) > 0)  std::cout << "a greater\n";

浮動小数点数とpartial_ordering

浮動小数点数では、NaNを扱うためにstd::partial_orderingを使用します。NaNとの比較結果はunorderedになります。

struct Measurement {
    double value;
    std::partial_ordering operator<=>(const Measurement&) const = default;
};

弱い順序付けの例

値を区別できても比較上は等しい場合には、弱い順序付けを使用します。たとえば、大文字と小文字を区別しない文字列が該当します。

==を個別にカスタマイズする

<=>をデフォルト化し、==をカスタム実装することもできます。等価性のルールが順序付けのルールと異なる場合があります。

古いコードの移行

クラスに複数の比較演算子が実装されている場合は、C++20への移行時にデフォルト化した<=>へ置き換えます。コード量を大幅に減らしながら、同じ意味を保てます。

<=>を使用しない場合

等価性だけが重要で順序が必要ない型では、operator==とoperator!=だけを用意します(C++20では後者が自動生成されます)。

パフォーマンスに関する注意

コンパイラーは、デフォルト化した<=>を手書きの比較と同じように効率よく最適化できます。宇宙船演算子を使用しても実行時のオーバーヘッドはありません。

簡単な確認

NaNを含む可能性がある浮動小数点型では、どの戻り値カテゴリを比較に使用すべきですか?

まとめ

C++20の<=>演算子は、1つの定義から6種類すべての関係演算子を生成します。メンバーを辞書順に比較するようデフォルト化します。型に応じて、強い順序付け、弱い順序付け、部分順序付けのいずれかを選択してください。

よくある質問

「三方比較演算子(C++20)」レッスンは無料ですか?

はい。「三方比較演算子(C++20)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「三方比較演算子(C++20)」で何を学びますか?

宇宙船演算子 を使って、簡潔で一貫した比較を実現します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「三方比較演算子(C++20)」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 算術演算子と比較演算子
  2. ストリーム挿入演算子と抽出演算子
  3. 添字演算子と関数呼び出し演算子
  4. 三方比較演算子(C++20)
← C++ Academyに戻る