gcc vs MSVC C ++:将unique_ptrs队列推送到向量中

时间:2018-04-10 19:27:34

标签: c++ visual-c++ g++ clang++

众所周知,如果你想将某些东西推入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仍然存在问题:(

0 个答案:

没有答案