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());
}

Reply via email to