Esto no es una garantía del estándar, pero como otro punto de datos, v.push_back(v[0])
es seguro para libc ++ de LLVM .
std::vector::push_back
Llamadas de libc ++__push_back_slow_path
cuando necesita reasignar memoria:
void __push_back_slow_path(_Up& __x) {
allocator_type& __a = this->__alloc();
__split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1),
size(),
__a);
// Note that we construct a copy of __x before deallocating
// the existing storage or moving existing elements.
__alloc_traits::construct(__a,
_VSTD::__to_raw_pointer(__v.__end_),
_VSTD::forward<_Up>(__x));
__v.__end_++;
// Moving existing elements happens here:
__swap_out_circular_buffer(__v);
// When __v goes out of scope, __x will be invalid.
}
push_back
. Otro póster notó un error en él , que no manejó adecuadamente el caso que usted describe. Nadie más, por lo que puedo decir, argumentó que esto no era un error. No digo que sea una prueba concluyente, solo una observación.