https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64814
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Actually it's nothing to do with operating on a copy of the iterator, it's due
to this in the implementation of copy_n:
if (--__n > 0)
++__first;
So as you observe we don't increment the input iterator on the last step.
However, I don't see any requirement in the standard that says we're supposed
to do so. All that is required is n assignments, there is no guarantee that the
input range is also incremented past the last element written to. So I think
you are assuming something that isn't actually guaranteed by the standard.