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 | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~