rvalue引用成员变量

时间:2015-05-17 19:40:02

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

我想知道是否有一个rvalue引用变量(而不是函数参数)?我理解使用rvalue引用作为函数变量,因为它可以避免不必要的分配等。但是有一个用例rvalue引用变量不是函数参数吗?最初我认为使用这些变量我们可以捕获以rvalue传递的数据以供稍后使用,但似乎如果我们有一个rvalue引用变量,那么我们已经可以获取它的地址,因此它不再是rvalue引用。

我尝试了以下代码,并且(不出所料)不编译。那么为什么我想要一个rvalue引用变量?

void test(int&& a) {}

int&& a(22);
test(a);

谢谢!

1 个答案:

答案 0 :(得分:4)

您的a这里是右值参考的名称。 a本身是左值引用的左值(你可以取其地址)(是的,有点令人困惑)。因此,无论何时将a传递给test(a),都会传递一个左值。将左值作为任何具有名称的对象,或者后者可以使用其地址的对象。并且您不能将左值绑定到右值引用,因此编译错误

  

错误:无法绑定' int'左值' int&&'

您需要传递std::move(a)。在这种情况下,你抛弃了a的左值。

请注意,在函数a内部也是左值(同样,您可以对其执行左值运算,例如获取其地址等)。只要您想将其用作右值,就需要强制转换(std::move)。例如,假设您有一个带有成员变量Bar的对象Foo member;,并且您希望通过成员函数f进入该对象:

void Bar::f(Foo&& param)
{
    member = std::move(param); // need std::move here to move param into member
}

// invoked it as
bar.f(std::move(some_foo)); // move some_foo into param

如果您未将param投放到std::move的右值引用,那么您不能将param移至member,只需复制即可它(如果param是可复制的,否则你会得到一个编译时错误),因为param本身就是一个左值。希望这能澄清它。