我有[简化]代码:
class AClass{
public:
AClass( BigClass && bc ) : m_bc{std::move(bc)} {}
private:
BigClass m_bc;
};
AClass * aFunction( BigClass && bc ){
return new AClass( std::move(bc) );
}
有用。但它正确吗?BigClass 数据在调用过程中移动而不创建临时对象?
我有[简化]代码:
class AClass{
public:
AClass( BigClass && bc ) : m_bc{std::move(bc)} {}
private:
BigClass m_bc;
};
AClass * aFunction( BigClass && bc ){
return new AClass( std::move(bc) );
}
有用。但它正确吗?BigClass 数据在调用过程中移动而不创建临时对象?
是的,你所拥有的是正确的。您需要使用std::move
,否则代码将无法编译。原因可能不是很明显。如果我们这样调用你的函数:
AClass *a = aFunction(BigClass{});
aFunction
使用右值调用,右值是BigClass
的默认构造函数的返回值。但在内部aFunction
,变量bc
是一个左值。请记住,如果它有名称,它就是一个左值。为了使用的移动构造函数,我们必须bc
变成一个右值。std::move
AClass
为了更清楚地看到这一点,让我们添加一些打印输出(和一个复制构造函数)到AClass
:
AClass( BigClass & bc ) : m_bc{bc} { std::cout << "Copy\n"; }
AClass( BigClass && bc ) : m_bc{std::move(bc)} { std::cout << "Move\n"; }
如果你离开std::move
了aFunction
,你会得到副本。有了它,你就会行动起来。