template<class I>
concept nothrow-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 nothrow-sentinel-for = sentinel_for<S, I>; // exposition only
template<class S, class I>
concept nothrow-sized-sentinel-for = // exposition only
nothrow-sentinel-for<S, I> &&
sentinel_for<S, I>;
template<class R>
concept nothrow-input-range = // exposition only
range<R> &&
nothrow-input-iterator<iterator_t<R>> &&
nothrow-sentinel-for<sentinel_t<R>, iterator_t<R>>;
template<class I>
concept nothrow-forward-iterator = // exposition only
nothrow-input-iterator<I> &&
forward_iterator<I> &&
nothrow-sentinel-for<I, I>;
template<class R>
concept nothrow-forward-range = // exposition only
nothrow-input-range<R> &&
nothrow-forward-iterator<iterator_t<R>>;
template<class I>
concept nothrow-bidirectional-iterator = // exposition only
nothrow-forward-iterator<I> &&
bidirectional_iterator<I>;
template<class R>
concept nothrow-bidirectional-range = // exposition only
nothrow-forward-range<R> &&
nothrow-bidirectional-iterator<iterator_t<R>>;
template<class I>
concept nothrow-random-access-iterator = // exposition only
nothrow-bidirectional-iterator<I> &&
random_access_iterator<I> &&
nothrow-sized-sentinel-for<I, I>;
template<class R>
concept nothrow-random-access-range = // exposition only
nothrow-bidirectional-range<R> &&
nothrow-random-access-iterator<iterator_t<R>>;
template<class R>
concept nothrow-sized-random-access-range = // exposition only
nothrow-random-access-range<R> && sized_range<R>;