https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101091
--- Comment #1 from Jakub Gałecki <j.galecki11 at gmail dot com> --- Consider the following example: https://godbolt.org/z/YYzqWaM9G #include <algorithm> #include <ranges> #include <vector> void copy_drop_n1(const std::vector<double>& src, std::vector<double>& dest, std::size_t n) { // size_t - narrowing conversion std::ranges::copy(src | std::views::drop(n), begin(dest) + n); } void copy_drop_n2(const std::vector<double>& src, std::vector<double>& dest, std::ptrdiff_t n) { // ptrdiff_t std::ranges::copy(src | std::views::drop(n), begin(dest) + n); } As per the standard [range.take.overview]: The name views::take denotes a range adaptor object ([range.adaptor.object]). Let E and F be expressions, let T be remove_cvref_t<decltype((E))>, and let D be range_difference_t<decltype((E))>. If decltype((F)) does not model convertible_to<D>, views::take(E, F) is ill-formed. Otherwise, the expression views::take(E, F) is expression-equivalent to [...] The example above should therefore compile for size_t as well as ptrdiff_t, since size_t is convertible to ptrdiff_t. This is a regression from libstdc++ version 10.x, where both functions compile.