2

我有[简化]代码:

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 数据在调用过程中移动而不创建临时对象?

4

1 回答 1

0

是的,你所拥有的是正确的。您需要使用std::move,否则代码将无法编译。原因可能不是很明显。如果我们这样调用你的函数:

AClass *a = aFunction(BigClass{});

aFunction使用右值调用,右值是BigClass的默认构造函数的返回值。但在内部aFunction,变量bc是一个左值。请记住,如果它有名称,它就是一个左值。为了使用的移动构造函数,我们必须bc变成一个右值。std::moveAClass

为了更清楚地看到这一点,让我们添加一些打印输出(和一个复制构造函数)到AClass

AClass( BigClass & bc ) : m_bc{bc} { std::cout << "Copy\n"; }
AClass( BigClass && bc ) : m_bc{std::move(bc)} { std::cout << "Move\n"; }

如果你离开std::moveaFunction,你会得到副本。有了它,你就会行动起来。

于 2013-03-15T02:08:53.870 回答