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
产生一个左值引用。删除常量
将导致该移动产生一个无名的右值。在再次编辑答案之前,我无法向上投票。请这样做,我将取消我的否决票。