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> &&
  sized_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>;