emplace_back
is required to be safe for the same reason push_back
is required to be safe; invalidation of pointers and references only has effect once the modifying method call returns.
In practice, this means that emplace_back
performing a reallocation is required to proceed in the following order (ignoring error handling):
- Allocate new capacity
- Emplace-construct new element at the end of the new data segment
- Move-construct existing elements into new data segment
- Destruct and deallocate old data segment
At this reddit thread STL acknowledges failure of VC11 to support v.emplace_back(v[0])
as a bug, so you should definitely check whether your library supports this usage and not take it for granted.
Note that some forms of self-insertion are specifically prohibited by the Standard; for example in [sequence.reqmts] paragraph 4 Table 100 a.insert(p,i,j)
has the prerequisite “i
and j
are not iterators into a
“.