2013-12-16 261 views
3

考慮下面的代碼:爲什麼調用複製構造函數而不是移動構造函數?

class Outer 
{ 
class Inner 
{ 
public: 
    Inner(Inner&& i):outers(std::move(i.outers)),test(std::move(test)) 
    {} 

    void addOuter(const Outer& o) {outers.push_back(std::move(o));} 
private: 
    std::vector<Outer> outers;  
    std::unique_ptr<std::string> test;  
}; 

public: 
Outer(Outer&& o):inners(std::move(o.inners)) 
{} 
private: 
std::vector<Inner> inners; 

}; 

當我嘗試編譯上面的代碼上的Visual Studio 2012,我得到以下錯誤:

Error 1 error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'

顯然,編譯器調用拷貝構造函數,而不是在addOuter方法中找到的push_back中的移動構造函數。這是一個編譯器錯誤?如果沒有,爲什麼,對於這個特定的情況,是不是移動構造函數調用?

+3

可能是因爲'o'作爲'addOuter'的'const'引用傳遞。 –

+1

@Andrey這應該是一個答案。 – Angew

+0

它看起來像你需要一個'void addOuter(Outer && o){outers.push_back(std :: move(o));}'overload – juanchopanza

回答

12

因爲o作爲const參考addOuter

+2

@register不,這是正確的。 const引用使'std :: move'產生一個左值引用。刪除'const'會導致移動產生無名的右值。 – juanchopanza

+0

你說得對。我沒有意識到。 – register

+0

直到答案再次被編輯後,我無法註冊。請這樣做,我會刪除我的downvote。 – register

相關問題