最終更新日時: 2026年05月21日 16時00分02秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<ranges>

# std::ranges::iota_view::sentinel(C++20)

## 概要

`iota_view`が有限長かつ`common_range`ではない場合の番兵型。

`iota_view`の終端要素型の値を1つ記憶していて、比較演算は内部の値同士の比較となる。

このクラスの名前は規定されておらず、振る舞いのみが規定されている。

このクラスの型を取得したい場合、`sentinel_t`を使用できる。

なお、`iota_view`の番兵型は、無限長のときは`unreachable_sentinel_t`、有限長で`common_range`のときは`iterator`である。

## 実装例

    namespace std::ranges {
      template<weakly_incrementable W, semiregular Bound>
        requires weakly-equality-comparable-with<W, Bound>
      struct iota_view<W, Bound>::sentinel {
      private:
        Bound bound_ = Bound();
        constexpr explicit sentinel(Bound bound): bound_{bound} {
        }
      public:
        sentinel() = default;

        friend constexpr bool operator==(const iterator& x, const sentinel& y) {
          return x.value_ == y.bound_;
        }

        friend constexpr iter_difference_t<W> operator-(const iterator& x, const sentinel& y) requires sized_sentinel_for<Bound, W> {
          return x.value_ - y.bound_;
        }

        friend constexpr iter_difference_t<W> operator-(const sentinel& x, const iterator& y) requires sized_sentinel_for<Bound, W> {
          return -(y - x);
        }
      };
    }

## バージョン

### 言語

- C++20

### 処理系

- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ?
- Visual C++: 2019 Update 10 ✅

## 参照

- N4861 24 Ranges library
- C++20 ranges
- P3059R2 Making user-defined constructors of view iterators/sentinels private
  - C++26で、ユーザー定義のコンストラクタを`public`から`private`に移動