我正在尝试合并unique_ptr
的两个向量(即std::move
将它们从一个转换为另一个转换为另一个向量)并且我继续遇到“使用已删除的函数...”错误之墙文本。根据错误,我显然试图使用unique_ptr
删除的拷贝构造函数,但我不知道为什么。以下是代码:
#include <vector>
#include <memory>
#include <algorithm>
#include <iterator>
struct Foo {
int f;
Foo(int f) : f(f) {}
};
struct Wrapper {
std::vector<std::unique_ptr<Foo>> foos;
void add(std::unique_ptr<Foo> foo) {
foos.push_back(std::move(foo));
}
void add_all(const Wrapper& other) {
foos.reserve(foos.size() + other.foos.size());
// This is the offending line
std::move(other.foos.begin(),
other.foos.end(),
std::back_inserter(foos));
}
};
int main() {
Wrapper w1;
Wrapper w2;
std::unique_ptr<Foo> foo1(new Foo(1));
std::unique_ptr<Foo> foo2(new Foo(2));
w1.add(std::move(foo1));
w2.add(std::move(foo2));
return 0;
}
答案 0 :(得分:7)
您正试图从常量Wrapper
对象移动。通常,移动语义还要求您移动的对象是可变的(即不是const
)。在您的代码中,other
方法中add_all
参数的类型为const Wrapper&
,因此other.foos
也指常量向量,您无法移动从它。
将other
参数的类型更改为Wrapper&
以使其正常工作。