Proposed resolution:
This wording is relative to N4917.
Modify [iterator.traits] as indicated:
-2- The definitions in this subclause make use of the following exposition-only concepts:
[…] template<class I> concept cpp17-forward-iterator = cpp17-input-iterator<I> && constructible_from<I> && is_lvalue_reference_v<iter_reference_t<I>> && same_as<remove_cvref_t<iter_reference_t<I>>, typename indirectly_readable_traits<I>::value_type> && requires(I i) { { i++ } -> convertible_to<const I&>; { *i++ } -> same_as<iter_reference_t<I>>; }; […]
Modify [range.transform.iterator] as indicated:
-2- The member typedef-name iterator_category is defined if and only if Base models forward_range. In that case, iterator::iterator_category is defined as follows: Let C denote the type iterator_traits<iterator_t<Base>>::iterator_category.
(2.1) — If is_
lvalue_reference_v<invoke_result_t<maybe-const<Const, F>&, range_reference_t<Base>>> is true, then
(2.1.1) — if C models derived_from<contiguous_iterator_tag>, iterator_category denotes random_access_iterator_tag;
(2.1.2) — otherwise, iterator_category denotes C.
(2.2) — Otherwise, iterator_category denotes input_iterator_tag.
Modify [range.join.with.iterator] as indicated:
-2- The member typedef-name iterator_category is defined if and only if ref-is-glvalue is true, and Base and InnerBase each model forward_range. In that case, iterator::iterator_category is defined as follows:
(2.1) — […]
(2.2) — If
is_lvalue_reference_v<common_reference_t<iter_reference_t<InnerIter>, iter_reference_t<PatternIter>>>is false, iterator_category denotes input_iterator_tag.
(2.3) — […]
Modify [range.zip.transform.iterator] as indicated:
-1- The member typedef-name iterator::iterator_category is defined if and only if Base models forward_range. In that case, iterator::iterator_category is defined as follows:
(1.1) — If
invoke_result_t<maybe-const<Const, F>&, range_reference_t<maybe-const<Const, Views>>...>is not a
n lvaluereference, iterator_category denotes input_iterator_tag.(1.2) — […]
Modify [range.adjacent.transform.iterator] as indicated:
-1- The member typedef-name iterator::iterator_category is defined as follows:
(1.1) — If invoke_result_t<maybe-const<Const, F>&, REPEAT(range_reference_t<Base>, N)...> is not a
n lvaluereference, iterator_category denotes input_iterator_tag.(1.2) — […]