no-throw-input-iterator, no-throw-forward-iterator, no-throw-sentinel-for, no-throw-input-range, no-throw-forward-range (original) (raw)

template< class I > concept no-throw-input-iterator = std::input_iterator<I> && std::is_lvalue_reference_v<std::iter_reference_t<I>> && std::same_as<std::remove_cvref_t<std::iter_reference_t<I>>, std::iter_value_t<I>>; (1) (exposition only*)
template< class I > concept no-throw-forward-iterator = no-throw-input-iterator<I> && std::forward_iterator<I> && no-throw-sentinel-for<I, I>; (2) (exposition only*)
template< class S, class I >concept no-throw-sentinel-for = std::sentinel_for<S, I>; (3) (exposition only*)
template< class R > concept no-throw-input-range = ranges::range<R> && no-throw-input-iterator<ranges::iterator_t<R>> && no-throw-sentinel-for<ranges::sentinel_t<R>, ranges::iterator_t<R>>; (4) (exposition only*)
template< class R > concept no-throw-forward-range = no-throw-input-range<R> && no-throw-forward-iterator<ranges::iterator_t<R>>; (5) (exposition only*)

These exposition-only concepts specify that no exceptions are thrown from operations required by algorithms on iterators, sentinels, and ranges.

[edit] Semantic requirements

Like all standard concepts, every concept listed here is modeled only if all concepts it subsumes are modeled.

  1. A type I models _no-throw-input-iterator_ only if no exceptions are thrown from increment, copy construction, move construction, copy assignment, move assignment, or indirection through valid iterators.

  2. Types S and I model _no-throw-sentinel-for_ only if no exceptions are thrown from copy construction, move construction, copy assignment, move assignment, or comparisons between valid values of type I and S.

  3. A type R models _no-throw-input-range_ only if no exceptions are thrown from calls to ranges::begin and ranges::end on an object of type R.

[edit] Notes

These concepts allow some operations on iterators and sentinels to throw exceptions, e.g. operations on invalid values.

[edit] See also