< cpp‎ | iterator
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
Iterator adaptors
Stream iterators
Iterator customization points
Iterator operations
Range access
Defined in header <iterator>
template< class S, class I >

    concept sentinel_for =
        std::semiregular<S> &&
        std::input_or_output_iterator<I> &&

        __WeaklyEqualityComparableWith<S, I>;
(since C++20)

The sentinel_for concept specifies the relationship between an input_or_output_iterator type and a semiregular type whose values denote a range. The exposition-only concept __WeaklyEqualityComparableWith is described in equality_comparable.

[edit] Semantic requirements

Let s and i be values of type S and I, respectively, such that [is) denotes a range. sentinel_for<S, I> is modeled only if:

  • i == s is well-defined.
  • If bool(i != s) then i is dereferenceable and [++is) denotes a range.
  • std::assignable_from<I&, S> is either modeled or not satisfied.

The domain of == can change over time. Given an iterator i and sentinel s such that [is) denotes a range and i != s, [is) is not required to continue to denote a range after incrementing any iterator equal to i (and so i == s is no longer required to be well-defined after such an increment).

[edit] Notes

A sentinel type and its corresponding iterator type are not required to model equality_comparable_with, because the sentinel type may not be comparable with itself, and they are not required to have a common reference type.

It has been permitted to use a sentinel type different from the iterator type in the range-based for loop since C++17.

[edit] Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior
LWG 3453 C++20 semantic requirements for sentinel_for were too loose for ranges::advance strengthened