这三个概念都是c++11引入的概念,在此总结一些粗浅的理解。c++
Lvalue = expressions of which we can get memory address
Rvalues = expressions of which we can't get memory address
但是实现上为了即使是右值表达式为了求出其值依然须要分配一块内存来存放这个值,这造成了一个临时对象,即便以后没有给这个对象取名,对象依然造成了,依然经历了构造和析构的完整生命周期。
这是C++支持RAII以后的事情了。并且即使如今基本类型的右值表达式并不须要事先分配内存。
左右并不是是C/C++才开始有的,而是当前计算机体系结构的客观现实。原本,左值是内存上的变量(有地址),右值是只在寄存器当中存在的值(没有地址)。
这样就好理解了吧。只不过有告终构体和对象概念以后,单个数据类型也可能大到没法完整存放在寄存器当中,须要在栈或者堆(反正都是内存)上开额外空间临时存放。再加上RAII的要求,因此才把事情搞那么绕,那么复杂。
其实若把这个临时空间(scratch memory)看做寄存器的扩展,不属于常规内存,那么就好理解了。事实上C++从语法规定上禁止对右值取地址,即使它在内存上有位置。这就是告诉你,这片内存并非一般的内存,逻辑上它只是超大寄存器。
https://www.zhihu.com/questio...express
ok,右值能够理解,那右值引用是什么鬼?为何要refer一块在内存上可是无法取地址访问的东西。c++98
中的引用很常见了,就是给变量取了个别名,咱们能够经过解引用获取到变量(对象),实际上这具体指的是左值引用函数