最終更新日時(UTC): 2025年10月20日 15時25分40秒
Raclamusi が更新

履歴 編集

function template
<tuple>

# std::operator<=>(C++20)

    namespace std {
      template<class... TTypes, class... UTypes>
      constexpr common_comparison_category_t<synth-three-way-result<TTypes, UTypes>...>
        operator<=>(const tuple<TTypes...>& t, const tuple<UTypes...>& u); // (1) C++20

      template<class... TTypes, tuple-like UTuple>
      constexpr common_comparison_category_t<synth-three-way-result<TTypes, Elems>...>
        operator<=>(const tuple<TTypes...>& t, const UTuple& u);           // (2) C++23

      // (2) の Elems は 型パラメータパック
      //   tuple_element_t<0, UTuple>, tuple_element_t<1, UTuple>, ...,
      //   tuple_element_t<tuple_size_v<UTuple> - 1, UTuple>
      // を表す。
    }

## 概要

2つの`tuple`オブジェクトの三方比較を行う。また、`tuple-like`なオブジェクトとの三方比較を行う。（C++23以降）

## 効果

`t`と`u`の辞書順比較を行う。

長さ0の`tuple`の場合は、`t <=> u`は`strong_ordering::equal`を返す。そうでなければ、以下と等価：

    if (auto c = synth-three-way(get<0>(t), get<0>(u)); c != 0)
      return c;
    return t tail <=> u tail;

ここで`r`tailは、`r`の最初の要素以外のすべてを含む`tuple`である。

## 備考

- この演算子により、以下の演算子が使用可能になる (C++20)：
  - `operator<`
  - `operator<=`
  - `operator>`
  - `operator>=`

## 例

    #include <cassert>
    #include <tuple>
    #include <string>

    int main()
    {
      std::tuple<int, char, const char*> t1(1, 'a', "hello");
      std::tuple<int, char, std::string> t2(1, 'a', "hello");
      std::tuple<int, char, std::string> t3(1, 'b', "world");

      assert((t1 <=> t2) == 0); // ※比較可能であれば型は異なっていてもかまわない
      assert(t1 < t3);
      assert(t1 <= t3);
      assert(t3 > t1);
      assert(t3 >= t1);
    }

### 出力

## バージョン

### 言語

- C++20

### 処理系

- Clang:
- GCC: 10 ✅
- Visual C++: ??

## 参照

- P1614R2 The Mothership has Landed
  - C++20での三方比較演算子の追加と、関連する演算子の自動導出