template<class I>
concept no-throw-input-iterator = // exposition only
input_iterator<I> &&
is_lvalue_reference_v<iter_reference_t<I>> &&
same_as<remove_cvref_t<iter_reference_t<I>>, iter_value_t<I>>;
template<class S, class I>
concept no-throw-sentinel-for = sentinel_for<S, I>; // exposition only
template<class R>
concept no-throw-input-range = // exposition only
range<R> &&
no-throw-input-iterator<iterator_t<R>> &&
no-throw-sentinel-for<sentinel_t<R>, iterator_t<R>>;
template<class I>
concept no-throw-forward-iterator = // exposition only
no-throw-input-iterator<I> &&
forward_iterator<I> &&
no-throw-sentinel-for<I, I>;
template<class R>
concept no-throw-forward-range = // exposition only
no-throw-input-range<R> &&
no-throw-forward-iterator<iterator_t<R>>;