https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101599
--- Comment #2 from 康桓瑋 <hewillk at gmail dot com> --- (In reply to 康桓瑋 from comment #0) > > We should std::move __first to recursive ranges::__copy_or_move() call since > some input_iterator such as basic_istream_view::iterator does not have the > copy constructor. > And ranges::reverse_copy also forgets std::move for the std::weakly_incrementable _Out. #include <algorithm> struct I { using value_type = int; using difference_type = std::ptrdiff_t; I() = default; I(I&&) = default; I(const I&) = delete; I& operator=(I&&) = default; I& operator++(); I operator++(int); value_type& operator*() const; bool operator==(const I&) const; }; int main() { std::ranges::reverse_copy(std::array<int, 5>{}, I{}); } https://godbolt.org/z/9Mfb1h3ad