【C++】Expression的学习笔记

本文深入解析了 C++ 中的左值和右值。左值对应有内存地址的对象,有名称;右值是临时使用的值对象,无名称。还介绍了右值的特点、纯右值(prvalue)、亡值(xvalue),以及它们之间的区别,同时提到了字符串立即数和 std::move 产生的右值变量的相关特性。

在这里插入图片描述
关于不同类别表达式的举例,请参考博文《C++ 中的值类别》

1. 左值和右值的简单理解

  • 左值对应了具有内存地址的对象,而右值仅仅是临时使用的值对象。(引用自博文《C++ 中的值类别》
  • 左值有名称(变量或常量名称),右值是临时对象没有名称

2. lvalue: locator-value

快速判断标准:每次调用此表达式,值所在的地址都一样。

Note
[Arthur O’Dwyer]:
So anything with a name is always an lvalue, regardless.
所以无论如何,任何有名字的对象总是左值。

13.3 rvalue:右值

右值举例:

  • Literals(字面量)ep. 42

13.3.1 右值的特点

  • 无法建立普通引用:因为右值没有合法的固定地址

13.3.2 prvalue: pure right-value

纯右值:prvalue
Cppreference: prvalue examles

prvalue被绑定到引用上时,其生命周期会延长

这里我们参考了博文《现代C++之万能引用、完美转发、引用折叠(万字长文)》中的描述:

[有生命周期延长的情况]:
如果一个 prvalue 被绑定到一个引用上,它的生命周期则会延长到跟这个引用变量一样长。

13.4 Xvalue:亡值

13.5 Xvalue与prvalue的区别

它们的主要区别在于,xvalue表示的对象是可以被移动的,其资源可以被转移到另一个对象中,而prvalue则不能。

13.6 String literal is an lvalue; other literals are rvalues.

C++标准中明确说明了:字符串立即数会被视为左值,而其它立即数则视为右值

13.7 Rvalue-reference

对于局部变量,std::move产生的右值变量和原始变量共享相同地址

示例:Cpp_var_rref

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值