最終更新日時: 2025年07月09日 00時33分39秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<iterator>

# std::basic_const_iterator::operator<=>(C++23)

    constexpr auto operator<=>(const basic_const_iterator& y) const
      requires random_access_iterator<Iterator> && three_way_comparable<Iterator>;          // (1)

    template<different-from<basic_const_iterator> I>
    constexpr auto operator<=>(const I& y) const
      requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I> &&
               three_way_comparable_with<Iterator, I>;                                      // (2)

## 概要

`basic_const_iterator<Iterator>`オブジェクトと別のイテレータ（`basic_const_iterator<Iterator>`か`Iterator`、`Iterator`と比較可能なオブジェクト）の三方比較を行う。

- (1) : `basic_const_iterator`同士の比較を行う
- (2) : ラップしているイテレータ（`Iterator`）と直接比較可能な型との間で比較を行う

## 効果

ラップするイテレータを`current_`というメンバに保持するとして

- (1) : 以下と等価

      return current_ <=> y.current_;

- (2) : 以下と等価

      return current_ <=> y;

## 備考

(2)の演算子により以下の演算子が使用可能になる（制約は同じものが適用される）。

    // 逆順
    template<different-from<basic_const_iterator> I>
    friend constexpr auto operator<=>(const I&, const basic_const_iterator&);

## 例

    #include <iostream>
    #include <iterator>
    #include <vector>
    #include <compare>

    int main() {
      std::vector vec = {1, 2, 3, 4, 5};

      std::basic_const_iterator cit = vec.begin();
      auto se = vec.end();
      std::basic_const_iterator cse = se;

      std::cout << std::boolalpha;

      // (1) basic_const_iterator同士の比較
      std::cout << std::is_lt(cit <=> cse) << '\n';
      std::cout << std::is_lt(cse <=> cit) << '\n';

      // (2) 元のイテレータとの比較
      std::cout << std::is_lt(cit <=> se) << '\n';
      std::cout << std::is_lt(se <=> cit) << '\n';
    }

### 出力

    true
    false
    true
    false

## バージョン

### 言語

- C++23

### 処理系

- Clang: ??
- GCC: 13.1 ✅
- Visual C++: 2022 Update 6 ✅

## 参照

- P2278R4 `cbegin` should always return a constant iterator