我有[简化]代码:
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数据是否在不创建临时值的情况下移动?
答案 0 :(得分:0)
是的,你拥有的是正确的。您需要使用std::move
或代码将无法编译。这可能不是很明显的原因。如果我们这样称呼您的函数:
AClass *a = aFunction(BigClass{});
使用rvalue调用 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
,您将获得副本。有了它,你就会有所收获。