Вы не можете надеяться обойти очевидную копию: std::vector<int> y(x.begin(), x.end();
. Элементы в y
будут выделены std::allocator
, а элементы в x
были выделены и будут уничтожены вашим собственным распределителем. Два распределителя могут иметь совершенно не связанные понятия память и указатели ! Нет причин, по которым память, используемая одним распределителем, каким-либо образом связана с памятью другого.
Что еще можно сделать, кроме как скопировать семантический элемент?
Если вам больше не нужен старый контейнер, вы должны сделать move , однако:
std::vector<int> y(std::make_move_iterator(x.begin()),
std::make_move_iterator(x.end()));
(Это поможет в случае, если элементы имеют свой собственный распределитель, который согласен. Конечно, не для int
.)
Обновление: Для подтверждения, обратите внимание, что внутренний буфер данных vector<T, Alloc>
равен не типа T*
, а скорее типа Alloc::pointer
. Нет никакой причины, что это связанные типы для двух разных распределителей.