I have been using the highly concise and intuitive C++ syntax for finding the intersection of two sorted vectors and putting the result in a third vector<
The important requirement for an output iterator is that it be valid and write-able for the range [out, out+size of output).
Passing c.begin() will lead to the values being overwritten which only works if the container c holds enough elements to overwrite. Imagine that c.begin() returns a pointer to an array of size 0 - then you'll see the problem when writing *out++ = 7;.
back_inserter adds every assigned value to a vector (via push_back) and provides a concise way of making the STL-algorithms extend a range - it overloads the operators that are used for iterators appropriately.
Thus
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
c.begin());
invokes undefined behavior once set_intersection writes something to its output iterator, that is, when the set intersection of a and b isn't empty.
Can a conforming implementation silently extend the vector in this case, so that begin() is in fact an appending
OutputIteratorlikeback_inserteris?
Of course. It's undefined behavior. (This is a humorous approach of telling you that you shouldn't even consider using this, no matter the effects on any implementation.)