最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<iterator>

# std::basic_const_iterator::operator-(C++23)

    template<sized_sentinel_for<Iterator> S>
    constexpr difference_type operator-(const S& y) const;  // (1)

    template<not-a-const-iterator S>
      requires sized_sentinel_for<S, Iterator>
    friend constexpr difference_type operator-(const S& x, const basic_const_iterator& y);  // (2) 非メンバ関数

## 概要

`basic_const_iterator`の間、もしくは`Iterator`に対応する番兵との間の距離を計算する。

`basic_const_iterator<Iterator>`のオブジェクトを`i`、`Iterator`に対応する番兵型のオブジェクトを`s`とすると

- (1) : `i - s`のためのオーバーロード
- (2) : `s - i`のためのオーバーロード

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

`not-a-const-iterator<I>`は`I`が`basic_const_iterator`の特殊化ではない場合に`true`となる説明専用のコンセプトである。

## 効果

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

- (1) : 以下と等価

      return current_ - y;

- (2) : 以下と等価

      return x - y.current_;

## 備考

(2)の関数はHidden friendsとして定義される。

## 例

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

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

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

      // 元のイテレータの番兵との間で距離計算
      std::cout << (cit - se) << '\n';
      std::cout << (se - cit) << '\n';

      std::basic_const_iterator cse = se;

      // basic_const_iterator同士で距離計算
      // (1) -> (2)と呼ばれることで内部イテレータ同士の距離計算を行う
      std::cout << (cit - cse) << '\n';
      std::cout << (cse - cit) << '\n';
    }

### 出力

    -5
    5
    -5
    5

## バージョン

### 言語

- C++23

### 処理系

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

## 参照

- P2278R4 `cbegin` should always return a constant iterator