众所周知,如果你想将某些东西推入std::vector<std::unique_ptr<Foo>>
,那么你必须将该指针的所有权移至Foo:
std::vector<std::unique_ptr<Foo>> vector;
std::unique_ptr<Foo> item;
vector.push_back(item); // Fails, as copy constructor is deleted for unique ptr
vector.push_back(std::move(item)); // Works
推送到矢量矢量的唯一指针也可以这样工作:
std::vector<std::vector<std::unique_ptr<Foo>>> vector;
std::vector<std::unique_ptr<Foo>> item;
vector.push_back(item); // Fails
vector.push_back(std::move(item)); // Works
当使用独特的矢量指针时,事情变得复杂了,我尝试在独特的队列指针上使用相同的技术:
std::vector<std::queue<std::unique_ptr<Foo>>> vector;
std::queue<std::unique_ptr<Foo>> item;
vector.push_back(std::move(item));
这实际上在MSVC 2015上编译和运行完美,但在gcc 5.4.0,gcc 7.3.0或clang 3.8.0上同时包含-std=c++11
和-std=c++17
它也因为删除了unique_ptr而失败构造
为什么会出现这种差异,将独特ptrs队列推入向量,移动所有权的正确,跨平台方式是什么?
更新:找到一种解决方法,强制队列由向量支持,此编译&amp;在gcc和MSVC上都能正常工作:
typedef std::queue<std::unique_ptr<Foo>, std::vector<std::unique_ptr<Foo>>> Item;
std::vector<Item> vector;
Item item;
vector.push_back(std::move(item));
但是deque仍然存在问题:(