https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100631

--- Comment #2 from 康桓瑋 <hewillk at gmail dot com> ---
In addition, I think elements_view::_Sentinel::_M_equal should be a template
function, and elements_view::_Iterator also needs to declare _Sentinel<!_Const>
as a friend, otherwise the following valid codes will be rejected:

https://godbolt.org/z/7aa75vqsP


#include <ranges>

int main() {
  auto r = std::views::iota(0)
    | std::views::transform([](int) { return std::make_pair(42, "hello"); })
    | std::views::keys;

  auto b = std::ranges::cbegin(r);
  auto e = std::end(r);
  b.base() == e.base();

  b == e; // error
}


<source>:12:9:   required from here
/opt/compiler-explorer/gcc-trunk-20210513/include/c++/12.0.0/ranges:3675:34:
error: cannot convert 'const
std::ranges::elements_view<std::ranges::transform_view<std::ranges::iota_view<int,
std::unreachable_sentinel_t>, main()::<lambda(int)> >, 0>::_Iterator<true>' to
'const
std::ranges::elements_view<std::ranges::transform_view<std::ranges::iota_view<int,
std::unreachable_sentinel_t>, main()::<lambda(int)> >, 0>::_Iterator<false>&'
 3675 |             { return __y._M_equal(__x); }
      |                      ~~~~~~~~~~~~^~~~~
/opt/compiler-explorer/gcc-trunk-20210513/include/c++/12.0.0/ranges:3645:45:
note:   initializing argument 1 of 'constexpr bool
std::ranges::elements_view<_Vp, _Nm>::_Sentinel<_Const>::_M_equal(const
std::ranges::elements_view<_Vp, _Nm>::_Iterator<_Const>&) const [with bool
_Const = false; _Vp = std::ranges::transform_view<std::ranges::iota_view<int,
std::unreachable_sentinel_t>, main()::<lambda(int)> >; long unsigned int _Nm =
0]'
 3645 |           _M_equal(const _Iterator<_Const>& __x) const
      |                    ~~~~~~~~~~~~~~~~~~~~~~~~~^~~

Reply via email to