最終更新日時: 2025年08月31日 21時36分04秒 (JST)
Raclamusi が更新

履歴 編集

class
<compare>

# std::strong_ordering(C++20)

    namespace std {
      class strong_ordering {
        int value;  //説明専用メンバ変数

        constexpr explicit strong_ordering(int v) noexcept : value(v) {}  //説明専用コンストラクタ

      public:

        static const strong_ordering less;
        static const strong_ordering equal;
        static const strong_ordering equivalent;
        static const strong_ordering greater;
      };

      //静的メンバ定数の定義（初期化している値は説明のためのもの）
      inline constexpr strong_ordering strong_ordering::less(-1);
      inline constexpr strong_ordering strong_ordering::equal(0);
      inline constexpr strong_ordering strong_ordering::equivalent(0);
      inline constexpr strong_ordering strong_ordering::greater(1);
    }

## 概要

`strong_ordering`は`<=>`の戻り値型として利用される比較カテゴリ型の一つであり、その比較が全順序の要件を満たしている事を表明する。

上記の説明専用のメンバ変数やコンストラクタは実際に実装されるものではなく、各定数の初期化時の値もあくまで説明専用のものである。これらに依存したプログラムにならないように注意が必要である。

### 代入可能性（substitutability）

`strong_ordering`による等値比較は代入可能性を満たしている事を表明する。

`strong_ordering`を返す`<=>`はそのように実装されている事が期待される。

## 静的メンバ定数

比較カテゴリ型はコンストラクタの提供が規定されていないため、その値は静的メンバ定数から取得する必要がある。

名前 | 説明 | 対応バージョン
--- | --- | ---
`less` | `a <=> b`の比較結果が`a < b`である事を表す値 | C++20
`equal, equivalent` | `a <=> b`比較結果が等値（`a == b`）である事を表す値 | C++20
`greater` | `a <=> b`の比較結果が`a > b`である事を表す値 | C++20

## メンバ関数

### 比較カテゴリ型への暗黙変換

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator partial_ordering` | `partial_ordering`への型変換演算子 | C++20
`operator weak_ordering` | `weak_ordering`への型変換演算子 | C++20

### 比較演算子

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator==` | 等値比較 | C++20
`operator!=` | 非等値比較 (`==`により使用可能) | C++20
`operator<` | 左辺が右辺より小さいかを判定する | C++20
`operator<=` | 左辺が右辺以下かを判定する | C++20
`operator>` | 左辺が右辺より大きいかを判定する | C++20
`operator>=` | 左辺が右辺以上かを判定する | C++20
`operator<=>` | 三方比較 | C++20

## strong_orderingによるカスタム比較実装例

    #include <iostream>
    #include <string>
    #include <compare>

    struct national {
      std::size_t my_number;
      std::string first_name;
      std::string last_name;

      auto operator<=>(const national& that) const -> std::strong_ordering {
        //宣言と逆順の比較

        if (auto comp = last_name  <=> that.last_name ; comp != 0) return comp;
        if (auto comp = first_name <=> that.first_name; comp != 0) return comp;
        return my_number <=> that.my_number;
      }
    };

    int main()
    {
      national p1 = {1, "tarou", "yamada"}, p2 = {2, "hanako", "suzuki"};

      std::cout << std::boolalpha;
      std::cout << (p1 <  p2) << std::endl;
      std::cout << (p1 <= p2) << std::endl;
      std::cout << (p1 >  p2) << std::endl;
      std::cout << (p1 >= p2) << std::endl;
    }

### 出力

    false
    false
    true
    true

## バージョン

### 言語

- C++20

### 処理系

- Clang: 8.0 ✅
- GCC: 10.1 ✅
- Visual C++: 2019 ✅

## 関連項目

- C++20 `<=>`/`==`による比較演算子の自動定義

## 参照

- P0515R3 Consistent comparison
- P0768R1 Library support for the spaceship (comparison) operator
- P1614R2 The Mothership has Landed (Adding <=> to the Library)