C++ 为什么调用复制构造函数而不是移动构造函数?

C++ 为什么调用复制构造函数而不是移动构造函数?,c++,c++11,move-constructor,C++,C++11,Move Constructor,考虑以下代码: 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> outer

考虑以下代码:

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;

};
类外部
{   
班级内部
{
公众:
内部(内部和外部):外部(标准::移动(i.outers)),测试(标准::移动(测试))
{}
void addOuter(const-Outer&o){outers.push_-back(std::move(o));}
私人:
std::向量输出;
标准:独特的ptr测试;
};
公众:
外部(外部和o):内部(标准::移动(o.inners))
{}
私人:
std::向量内部;
};
当我尝试在Visual Studio 2012上编译上述代码时,出现以下错误:

错误1错误C2248:'std::unique\u ptr::unique\u ptr':无法访问在类'std::unique\u ptr'中声明的私有成员。


显然,编译器在
addOuter
方法中的push_back中调用复制构造函数,而不是移动构造函数。这是一个编译器错误吗?如果不是,为什么在这种特定情况下,没有调用move构造函数?

,因为
o
作为
const
引用传递给
addOuter

可能是因为
o
作为
const
引用传递给
addOuter
@Andrey,这应该是答案。看起来您需要
void addOuter(Outer&&o){outers.push_back(std::move(o));}
,这是一些格式非常糟糕的代码……您的移动构造函数应该从
i.test
初始化
test
,而不是从自身初始化。@register no,这是正确的。const引用使
std::move
产生一个左值引用。删除
常量
将导致该移动产生一个无名的右值。在再次编辑答案之前,我无法向上投票。请这样做,我将取消我的否决票。