Назначьте std :: vector <std :: unique_ptr <T>> другому std :: vector <std :: unique_ptr <T>> - PullRequest
2 голосов
/ 25 июня 2019

У меня есть std::vector<std::unique_ptr<MyClass>>, и я назначаю его второму вектору того же типа.

Я получаю эту ошибку компилятора:

/opt/gcc-8.2.0/include/c++/8.2.0/bits/stl_algobase.h:324:18: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = MyClass; _Dp = std::default_delete<MyClass>]'
        *__result = *__first;

Это потому, что для выполнения назначения мне нужно определить оператор назначения перемещения для MyClass? Класс содержит только пару unordered_maps, набор и пару примитивов. Нет указателей членов.

Ответы [ 2 ]

8 голосов
/ 25 июня 2019

Вы не можете скопировать-назначить вектор из std::unique_ptr элементов другому, потому что вы не можете скопировать std::unique_ptr сам по себе.Он уникален!

Никакие операции, определенные на вашем MyClass, не могут изменить этот факт.

Вы можете перейти от такого вектора, но это означает, что исходный вектор больше не будет содержать этиstd::unique_ptr элементов.

3 голосов
/ 25 июня 2019

unique_ptr, как следует из названия, не подлежит копированию. Может существовать только один экземпляр. В результате вы не можете скопировать вектор, содержащий unique_ptr элементов, поскольку они не могут быть скопированы из одного вектора в другой. Вы можете перемещать только один вектор в другой:

dest_vector = std::move(src_vector);

src_vector нельзя использовать после этого (кроме перемещения чего-то нового в него.) Все содержащиеся в нем элементы переместились в dest_vector.

Если вам действительно нужны копии, используйте вместо этого shared_ptr. Каждая копия по-прежнему будет управлять одним и тем же указателем и будет отслеживать, сколько существует копий. Управляемый указатель будет только удаляться после уничтожения всех shared_ptr копий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...