2016-04-24 85 views
3

我試圖合併兩個向量unique_ptr(即std::move他們從一個到另一個),我一直遇到一個「使用已刪除的函數...」 「錯誤文字牆。根據錯誤,我顯然試圖使用unique_ptr的刪除拷貝構造函數,但我不知道爲什麼。以下是代碼:'使用刪除函數'當合並兩個向量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; 
} 

回答

7

您正在嘗試從常數Wrapper對象移動。一般來說,移動語義也要求你要離開的對象是可變的(即不是const)。在你的代碼中,add_all方法中other參數的類型是const Wrapper&,因此other.foos也指向一個常量向量,你不能離開它。

other參數的類型更改爲Wrapper&以使其工作。

+0

謝謝!這似乎已經做到了!我認爲移動語義的可變性是有道理的,因爲其他的向量會因此而變得無效。 –

+0

@AUD_FOR_IUV歡迎來到Stack Overflow! :-) – jotik