Proposed resolution:
This wording is relative to N4910.
Modify [range.utility.helpers] as indicated:
[Drafting note: This change effectively just moves the definitions of require-constant and tiny-range from [range.lazy.split.view] to [range.utility.helpers].]
[…] template<class T, class U> concept different-from = // exposition only !same_as<remove_cvref_t<T>, remove_cvref_t<U>>; template<auto> struct require-constant; // exposition only template<class R> concept tiny-range = // exposition only sized_range<R> && requires { typename require-constant<remove_reference_t<R>::size()>; } && (remove_reference_t<R>::size() <= 1);
Modify [range.owning.view], class template owning_view synopsis, as indicated:
[…] constexpr static auto size() requires tiny-range<R> { return R::size(); } constexpr auto size() requires sized_range<R> { return ranges::size(r_); } constexpr auto size() const requires sized_range<const R> { return ranges::size(r_); } […]
Modify [range.lazy.split.view], class template lazy_split_view synopsis, as indicated:
[Drafting note: This change effectively just moves the definitions of require-constant and tiny-range from [range.lazy.split.view] to [range.utility.helpers].]
namespace std::ranges {template<auto> struct require-constant; // exposition only template<class R> concept tiny-range = // exposition only sized_range<R> && requires { typename require-constant<remove_reference_t<R>::size()>; } && (remove_reference_t<R>::size() <= 1);template<input_range V, forward_range Pattern> requires view<V> && view<Pattern> && indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> && (forward_range<V> || tiny-range<Pattern>) class lazy_split_view : public view_interface<lazy_split_view<V, Pattern>> { […] }; […] }