如果传递函数,是否优化了Rvalue引用?

时间:2013-03-14 16:27:12

标签: c++ c++11 pass-by-reference rvalue-reference

我有[简化]代码:

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数据是否在不创建临时值的情况下移动?

1 个答案:

答案 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,您将获得副本。有了它,你就会有所收获。