C++ 右值引用

  C++中,左值(lvalue)是可以获取地址的一个量,例如一个有名称的变量。由于经常出现在赋值语句的左边,因此叫做左值。剩下的所有不是左值的量都叫右值(rvalue).例如临时对象或者临时值。通常右值位于福赋值运算符的右边。

  C++引入了一个新概念:右值引用,这是一个对右值的引用。右值引用的目的是提供一些设计临时对象时可以选用的特定方法(主要是拷贝构造函数以及operator=)。由于临时对象会被销毁,通过右值引用,某些设计复制大量值的操作可以通过简单地复制指向这些值的指针实现。

  方法可以将&&作为参数说明的一部分(例如 type&& name),从而指定右值引用参数。通常,临时对象被当做 const type&,但当方法使用了右值引用时,可以消除临时对象的这种开销。

  右值引用并不局限于函数的参数。可以声明右值引用类型的变量,并对其赋值,尽管这种用法并不常见。下面的代码,在C++中是不合法的。

 int& i = 3;//非法的

 int a=4,b=5;

 int& j = a+b; //非法的

 使用右值引用后,下面的代码就是合法的。

  int&& i = 3;

  int a=4,b=5;

 int&& j = a+b;


单独使用右值引用的情况很少,然而作为函数或者方法的参数时右值引用非常有用。看一下下面的代码及调试结果。



临时变量 a+b 的和传入作为右值引用,而且经过前面的左值引用自增后,void func(int&& value) 的输出是32。

如果删除接受左值引用的func(int& value)的定义,使用有名称的变量调用func()(例如 func(b))会导致编译错误,C++标准指出右值引用参数(int&& value)不能与左值(b)绑定。可以调用std::move()将左值强制转换为右值。

func(std::move(b));


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值