Consider:
std::vector<int> v;
v.push_back(41);
v.push_back(v.back());
The second push_back() can cause the vector to reallocate. If it reallocates before executing the push_back(), then performs the push_back(), then it will use-after-free its argument. If it reallocates after the push_back(), and the move constructor can throw, then we lose the strong exception guarantee.
The standard says:
> Remarks: Causes reallocation if the new size is greater than the old capacity. Reallocation invalidates all the references, pointers, and iterators referring to the elements in the sequence, as well as the past-the-end iterator.
So, it says nothing about whether a push_back referring to a vector element is legal.
Is this undefined behavior? Should it be specified to work? Should it be noted that it is dangerous?