Рассмотрим в качестве примера std::unordered_set
из std::unique_ptr<T>
. Могу ли я переместить элемент в другом месте?Как получить тип перемещения только из контейнера STL?
#include <unordered_set>
#include <iostream>
#include <memory>
#include <vector>
int main()
{
std::unordered_set<std::unique_ptr<int>> mySet;
mySet.insert(std::make_unique<int>(1));
mySet.insert(std::make_unique<int>(2));
mySet.insert(std::make_unique<int>(3));
std::vector<std::unique_ptr<int>> myVector;
for (auto&& element : mySet)
{
std::cout << *element << std::endl;
//myVector.push_back(element); won't compile as you can only get a const ref to the key
}
}
У меня есть очень практический пример кода, где я хотел бы сделать это, но я уменьшенный использовать std::shared_ptr
. Вы знаете другую (лучше?) Альтернативу?
Обратите внимание, что эта проблема не возникает, если 'mySet' были' станд :: вектор' вместо этого; он свойствен [контейнерам на узлах] (http://en.cppreference.com/w/cpp/container/node_handle). Также обратите внимание, что если вам удастся его перенести, он может сделать другие операции над этим заданием неопределенным поведением, так как перемещенный объект перестает быть действительным для чтения, например, для вставки или нахождения, поэтому следует проявлять осторожность при использовании контейнера вообще. – metal
@metal Я, вероятно, что-то делаю неправильно, но у меня такая же ошибка компиляции только с векторами, см. Http://coliru.stacked-crooked.com/a/51af3ac220c44619. edit: Мой плохой, работает с 'std :: move'. Благодаря ! Новый код: http://coliru.stacked-crooked.com/a/95cb8a827d587723 – matovitch