https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119415
--- Comment #15 from Jonathan Wakely <redi at gcc dot gnu.org> --- template<typename _Iter> using __iter_category_t = typename iterator_traits<_Iter>::iterator_category; template<typename _InIter> using _RequireInputIter = __enable_if_t<is_convertible<__iter_category_t<_InIter>, input_iterator_tag>::value>; So it can be shortened to: else if constexpr (ranges::common_range<_Rg> && requires { typename _RequireInputIterator<ranges::iterator_t<_Rg>>; })