我想知道是否有一个rvalue引用变量(而不是函数参数)?我理解使用rvalue引用作为函数变量,因为它可以避免不必要的分配等。但是有一个用例rvalue引用变量不是函数参数吗?最初我认为使用这些变量我们可以捕获以rvalue传递的数据以供稍后使用,但似乎如果我们有一个rvalue引用变量,那么我们已经可以获取它的地址,因此它不再是rvalue引用。
我尝试了以下代码,并且(不出所料)不编译。那么为什么我想要一个rvalue引用变量?
void test(int&& a) {}
int&& a(22);
test(a);
谢谢!
答案 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
本身就是一个左值。希望这能澄清它。