[2]
Note how assignment through a back_insert_iterator is implemented.
In general, unary operator* must be defined so that it returns a
proxy object, where the proxy object defines operator= to perform
the insert operation. In this case, for the sake of simplicity, the
proxy object is the back_insert_iterator itself. That is, *i simply
returns i, and *i = t is equivalent to i = t. You should not,
however, rely on this behavior. It is an implementation detail,
and it is not guaranteed to remain the same in future versions.

[3]
This function exists solely for the sake of convenience:
since it is a non-member function, the template parameters may be
inferred and the type of the back_insert_iterator need not be declared
explicitly. One easy way to reverse a range and insert it
at the end of a Back Insertion SequenceS, for example, is
reverse_copy(first, last, back_inserter(S)).