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


左值、右值是什么?

表达式的分类图:

expression
glvalue
lvalue
rvalue
xvalue
prvalue

glvalue: generalized lvalue, 广义左值,包含lvalue和xvalue
rvalue: 右值,包含xvalue和prvalue,因可能出现在表达式右侧得名
lvalue: 左值,因可能出现在表达式右左侧得名
xvalue: eXpiring value, 具有生命周期的值,涉及对象引用
prvalue: pure rvalue,只能出现在赋值表达式右侧的值,如字符串常量、基本类型值

右值(RValue)区分于左值(Lvalue),形如:

lvalue  = rvalue/pValue/xvalue);
或
lvalue; //如果是函数则按照返回类型判断,引用类型是左值,值类型是右值

左值的特点:

  1. 具有可以访问的地址(可取址)
    左值是被赋值的一方,那么它必定有能保存数据值的功能,即有可访问地址(const修饰依然是lvalue)。
  2. 长的生命周期,通常具有变量名
    表达式执行完依然存在,可重复使用,若函数返回引用类型可能没有变量名

右值的特点:

  1. 不具有可访问地址
  2. 临时变量,短周期,不具有变量名

例子:

#include <string>
using namespace std;
int main()
{
    string sLV1 = "C++";      //sLV1是左值,10是右值prvalue
    string sLV2 = sLV1;       //sLV2是左值,sLV1是右值xvalue

    int iLV1 = 100;           //iLV1是左值,100是右值prvalue
    int *pLV2 = & iLV1;       //pLV2是左值,&iLV1右值xvalue
    
    return 0;
}

左值引用

左值引用即我们以往说的引用,是一个别名,类似于指针,通常左值引用只能绑定左值且可以延长临时对象的生存期:

int main()
{
    int iLV1 = 100;           //iLV1是左值,100是右值prvalue
    int &rLV2 = iLV1;         //rLV2是左值引用

    return 0;
}

右值引用

右值引用使用的符号是&&,右值引用只能绑定右值,且可以延长临时对象的生存期,

int main()
{
    int iLV1 = 100;  
    int && pLV2 = iLV1 + 100;   //pLV2是右值引用,右值(iLV1 + 100)作为临时变量绑定到pLV2

    return 0;
}

参考

ISO/IEC N3690 - 3.10 Lvalues and rvalues
Microsoft 左值和右值
C++ 参考手册


总结

引用一次解释为绑定更为容易理解,右值引用通过将一组临时变量绑定到一个新的变量上,绑定该新变量但不销毁这组临时变量,所以并不需要分配内存和复制,新变量自然就延长了生命周期。此时,规定该类型为右值引用,类似左值却可以和左值区分开来,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值