最終更新日時: 2026年07月23日 11時34分53秒 (JST)
Raclamusi が更新

履歴 編集

function
<memory>

# std::indirect::operator<=>(C++26)

    template <class U, class AA>
    friend constexpr auto operator<=>(
      const indirect& lhs, const indirect<U, AA>& rhs)
        -> synth-three-way-result<T, U>; // (1)

    template <class U>
    friend constexpr auto operator<=>(
      const indirect& lhs, const U& rhs)
        -> synth-three-way-result<T, U>; // (2)

## 概要

- (1) : 2つの`indirect`オブジェクトが所有する値を三方比較する。
- (2) : `indirect`オブジェクトが所有する値と、別の値`rhs`を三方比較する。

いずれもHidden friendsとして定義される。

## 戻り値

- (1) : `lhs`と`rhs`のいずれかが無効値状態であれば`!lhs.valueless_after_move() <=> !rhs.valueless_after_move()`、そうでなければ`synth-three-way(*lhs, *rhs)`。
- (2) : `lhs`が無効値状態であれば`std::strong_ordering::less`、そうでなければ`synth-three-way(*lhs, rhs)`。

## 備考

この演算子により、`operator<` / `operator<=` / `operator>` / `operator>=`が使用可能になる。

## 例

    #include <cassert>
    #include <memory>

    int main()
    {
      std::indirect<int> a{1};
      std::indirect<int> b{2};
      assert(a < b);          // (1) indirect同士の比較
      assert((a <=> b) < 0);
      assert(a < 2);          // (2) 値との比較
    }

### 出力

## バージョン

### 言語

- C++26

### 処理系

- Clang: 22 ❌
- GCC: 16.1 ✅
- Visual C++: 2026 Update 2 ❌

## 関連項目

- `std::indirect`

## 参照

- P3019R14 `indirect` and `polymorphic`: Vocabulary Types for Composite Class Design