Proposed resolution:
This wording is relative to N4861.
Modify [range.transform.iterator] as indicated:
[…]namespace std::ranges { template<input_range V, copy_constructible F> requires view<V> && is_object_v<F> && regular_invocable<F&, range_reference_t<V>> && can-reference<invoke_result_t<F&, range_reference_t<V>>> template<bool Const> class transform_view<V, F>::iterator { public: […] friend constexpr iterator operator-(iterator i, difference_type n) requires random_access_range<Base>; friend constexpr difference_type operator-(const iterator& x, const iterator& y) requiresrandom_access_range<Base>sized_sentinel_for<iterator_t<Base>, iterator_t<Base>>; […] }; }friend constexpr difference_type operator-(const iterator& x, const iterator& y) requiresrandom_access_range<Base>sized_sentinel_for<iterator_t<Base>, iterator_t<Base>>;-22- Effects: return x.current_ - y.current_;
Modify [range.elements.iterator] as indicated:
[…]namespace std::ranges { template<input_range V, size_t N> requires view<V> && has-tuple-element<range_value_t<V>, N> && has-tuple-element<remove_reference_t<range_reference_t<V>>, N> template<bool Const> class elements_view<V, N>::iterator { // exposition only […] friend constexpr iterator operator-(iterator x, difference_type y) requires random_access_range<Base>; friend constexpr difference_type operator-(const iterator& x, const iterator& y) requiresrandom_access_range<Base>sized_sentinel_for<iterator_t<Base>, iterator_t<Base>>; }; }constexpr difference_type operator-(const iterator& x, const iterator& y) requiresrandom_access_range<Base>sized_sentinel_for<iterator_t<Base>, iterator_t<Base>>;-21- Effects: return x.current_ - y.current_;