2013-12-16 79 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

相关问题