最終更新日時: 2024年09月17日 18時19分37秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<functional>

# std::reference_wrapper::operator<=>

    friend constexpr synth-three-way-result<T>
      operator<=>(reference_wrapper x,
                  reference_wrapper y);          // (1) C++26

    friend constexpr synth-three-way-result<T>
      operator<=>(reference_wrapper x,
                  const T& y);                   // (2) C++26

    friend constexpr synth-three-way-result<T>
      operator<=>(reference_wrapper x,
                  reference_wrapper<const T> y); // (3) C++26

## 概要

三方比較を行う。

- (1) : 同じ要素型の`reference_wrapper`同士を三方比較する
- (2) : `reference_wrapper`と要素型`T`を三方比較する
- (3) : `reference_wrapper<T>`と`reference_wrapper<const T>`を三方比較する

(2)と(3)はオペランドを左右で逆にしても使用できる。

## テンプレートパラメータ制約

- (3) : `is_const_v<T>`が`false`であること

## 戻り値

- (1) :

      return synth-three-way(x.get(), y.get());

- (2) :

      return synth-three-way(x.get(), y);

- (3) :

      return synth-three-way(x.get(), y.get());

## 備考

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

## 例

    #include <cassert>
    #include <compare>
    #include <functional>

    int main()
    {
      int x = 3;
      int y = 3;
      int z = 4;

      assert((std::ref(x) <=> std::ref(y)) == 0);
      assert(std::ref(x) < std::ref(z));
      assert(std::ref(x) <= std::ref(z));
      assert(std::ref(z) > std::ref(x));
      assert(std::ref(z) >= std::ref(x));

      assert((std::ref(x) <=> 3) == 0);
      assert((3 <=> std::ref(x)) == 0);

      assert((std::ref(x) <=> std::cref(y)) == 0);
      assert((std::cref(x) <=> std::ref(y)) == 0);
    }

### 出力

## バージョン

### 言語

- C++26

### 処理系

- Clang: 11.0 ✅
- GCC: 10 ✅
- Visual C++: 2019 ✅

## 参照

- P2944R3 Comparisons for `reference_wrapper`