合并两个unique_ptr向量时'使用已删除的函数'

时间:2016-04-24 15:28:10

标签: c++ c++11 move-semantics unique-ptr deleted-functions

我正在尝试合并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;
}

1 个答案:

答案 0 :(得分:7)

您正试图从常量Wrapper对象移动。通常,移动语义还要求您移动的对象是可变的(即不是const)。在您的代码中,other方法中add_all参数的类型为const Wrapper&,因此other.foos也指常量向量,您无法移动从它。

other参数的类型更改为Wrapper&以使其正常工作。