简化代码:
#include <queue>
#include <memory>
#include <vector>
class Foo {
public:
Foo() {};
virtual ~Foo() {}
};
int main()
{
std::queue<std::unique_ptr<Foo>> queue;
auto element = std::make_unique<Foo>();
queue.push(std::move(element));
std::vector<std::queue<std::unique_ptr<Foo>>> vector;
// Error 1
vector.push_back(queue);
// Error 2
vector.push_back(std::move(queue));
// Error 3
vector.push_back({});
return 0;
}
错误:
'std::unique_ptr>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': 尝试引用已删除的函数
显然,unique_ptr的复制构造函数被删除了,但我并没有尝试复制它。难道我真的在复制吗?
push_back
会复制对象。要在原地创建对象,请使用emplace_back
。 - Ben Voigtstd::queue
替换为std::vector
,它可以工作;但是在std::deque
的默认队列底层下不起作用。但是对于不在向量中的deque
进行move
操作是可以正常工作的。奇怪。 - M.Mvector
中的deque
。但是该操作将不会是noexcept
的。vector
只是不喜欢可能会抛出异常的移动(有关详细信息,请参见 aschepler 的答案)。 - Arne Vogel