https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102807
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- It evaluates to false because is_array_v<T> is false for that type. The next candidate is the problem: and 'std::ranges::ref_view<std::unordered_map<int, int>> &' does not satisfy '__member_begin' because '__decay_copy(__t.begin())' would be invalid: no member named 'begin' in 'std::ranges::ref_view<std::unordered_map<int, int>>' That's wrong. I don't know why ref_view::begin() isn't usable. Reduced: #include <ranges> struct Range { int* begin() { return &i; } int* end() { return begin() + 1; } const int* begin() const { return &i; } const int* end() const { return begin() + 1; } int i = 0; }; int main() { static_assert(std::ranges::range<Range>); static_assert(std::ranges::range<const Range>); using R = std::ranges::ref_view<Range>; static_assert(std::ranges::range<R>); using I = decltype(std::declval<R&>().begin()); }