2015-03-04 2 views
1

Как бы вы выполняли операцию перемещения над классом, который использует unique_ptr? Не установил бы unique_ptr значение null для удаления данных? Если я выполню копию через инициализатор списка unique_ptr, как это, будут ли данные сохранены или удалены?move semantics and unique_ptr


template<typename T, typename A = std::allocator<T>> 
class forward_list 
{ 
... 
private: 
    struct node 
    { 
     T data; 
     std::unique_ptr<T> next; 
    }; 
    std::unique_ptr<node> root_; 
    std::unique_ptr<node> leaf_; 
    size_t count_; 
    const A& heap; 
}; 

// Move constructor. Constructs the container with the contents of other using move semantics. 
// If alloc is not provided, allocator is obtained by move-construction from the allocator belonging to other. 
inline forward_list(forward_list&& other) 
: root_(other.root_), leaf_(other.leaf_), count_(other.count_), heap(other.heap) 
{ 
    other.root_ = nullptr; 
    other.leaf_ = nullptr; 
    other.count_ = 0; 
}; 
+2

Вам не нужно определять конструктор перемещения (если только 'forward_list' не имеет других специальных функций-членов, которые здесь не показаны). Компилятор сгенерирует конструктор перемещения, который будет делать правильные вещи в этом случае (опять же, если предположить, что нет других присутствующих членов данных, которые вы не указали выше). – Praetorian

+0

Я считаю, что unique_ptr уже работает аналогично движению семантики вообще. Это означает, что в момент, когда ваш код присваивает уникальные указатели, они уже нулевые, потому что их содержимое было перенесено на новые указатели. –

+0

@Praetorian Я определил (не показано здесь для простоты) многие другие функции-члены, включая все те, которые определены для stl forward_list. –

ответ

2

Вы должны двигаться указатель.

forward_list(forward_list&& other) : 
    root_(std::move(other.root_)), 
    leaf_(std::move(other.leaf_)), 
    count_(other.count_), 
    heap(other.heap) 
{ 
    // Do nothing 
} 
Смежные вопросы