C++左值引用和右值引用解析

      C++11引入了Rvalue Reference(右值引用)的概念,Rvalue Reference是一个绑定到Rvalue(右值)的Reference。那么哪些情况下产生Lvalue,哪些情况下产生Rvalue那?对于函数返回的引用对象、赋值、数组[]、去引用、prefix ++/--,这些操作能够返回Lvalue,我们能够使用Lvalue Reference绑定他们。对于函数返回非引用对象、数值计算、关系运算、位运算,postfix ++/--,这些操作能够返回Rvalue,我们能够使用Rvalue Reference绑定他们。

    Rvalue Reference通过Object&&表示。

int i = 42;
int &&r = i; //error,i是一个Lvalue
int &&r2 = i * 2; //ok,运算结果返回右值,Rvalue Reference可以绑定

    对C++Lvalue和Rvalue语义进行理解,Lvalue Persist;Rvalue Are Ephemeral(《C++ Primier》)。也就是说Rvalue Reference绑定到临时的对象,所谓“临时”表示:1.这些对象将会被destroyed;2.这些对象变量之后将不会再被使用。但是这些对象实体内部还有资源,鉴于这些对象的“临时”属性,我们可以将这些Rvalue的资源“偷”过来,做到资源的高效利用,这也就能够帮助我们提高代码效率、以及计算机资源的利用率,代码优化的时候一定要考虑。

      对于Lvalue和Rvalue,还有一点不是特别好理解,就是Variables Are Lvalue。

int &&rr1 = 42; //ok,42数值本身是Rvalue
int &&rr2 = rr1; //error, rr1变量本身是一个Lvalue
    我说一说我的理解,其实可以发现对于一个像函数返回的非引用对象、两个数的运算结果,这些返回回来的值如果我们不再次赋值的话,这些返回值其实就是“一闪而过”的结果,或者说他们就是一个“中间态”,用于辅助计算机的,把他们称为Rvalue。我们无法用一个变量(var)去承载它,我们只能使用Rvalue Reference。而当一个Rvalue Reference变量承载了Rvalue以后,这个变量本身实际已经是一个Lvalue,他不同于它所承载的Rvalue。Rvalue是临时的,它的用处是“资源被偷去用于更加高效的利用”,用完了就没用了,要被destroyed。但是承载它的Rvalue Reference变量一直都是一个变量,直到它离开自己的scope才会被destroyed。

    


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值