23 Iterators library [iterators]

23.3 Iterator requirements [iterator.requirements]

23.3.6 Indirect callable requirements [indirectcallable]

23.3.6.3 Class template projected [projected]

Class template projected is used to constrain algorithms that accept callable objects and projections ([defns.projection]).
It combines a readable type I and a callable object type Proj into a new readable type whose reference type is the result of applying Proj to the iter_­reference_­t of I.
namespace std {
  template<readable I, indirectly_regular_unary_invocable<I> Proj>
  struct projected {
    using value_type = remove_cvref_t<indirect_result_t<Proj&, I>>;
    indirect_result_t<Proj&, I> operator*() const;              // not defined
  };

  template<weakly_incrementable I, class Proj>
  struct incrementable_traits<projected<I, Proj>> {
    using difference_type = iter_difference_t<I>;
  };
}