左值和右值得研究
关于左值引用和右值引用的问题
Hello,各位看官好,最近我在通读源码的时候看到了一个关键字decltype,我对这个关键字很不理解,所以就上网搜索了一下,发现了很多我不知道的东西,那么在读这个关键字的同时,我还发现了左值和右值,左值引用,右值引用这四者之间的关系,这是我之前所没有搞清楚的,所以我想趁此时机好好的把这些东西搞清楚。
一、左值和右值
1.1 左值和右值得概念
1.2 左值和右值得特点
1.3 什么情况是左值,什么情况是右值
二、左值和右值得关系
三、左值引用和右值引用
四、左值引用和右值引用的关系
一、左值和右值
1.1 左值和右值的概念
首先我们来说一下左值和右值,首先这里说一下,表达式所有的结果要么是左值,要么就是右值。
那么究竟什么是左值,什么又是右值呢?在c++ Prmer Plus中,所谓左值,就是说前者可以所表示的意义就是内存中所占用的对象,所谓右值,就是说这个值代表的内容。
举一个最简单的例子:int a = 3;
在这个表达式中,中间这个=至关重要,这个等号我们称其为赋值符号,就是说把右侧的值赋给了左侧的值,那么这样就是显而易见的,a是一个左值,因为他代表的含义就是内存中所占用的对象,3代表一个右值,表示的是表示的实际内容3.
那么搞清楚了左值和右值得概念,我们来说一下什么情况是右值,什么情况是左值。
1.2 左值和右值得特性
左值和右值得特性有两个不同:
1、左值长远,右值短暂
左值是我们一直要用到后面的东西,所以左值是临时变量,右值是很短暂的,就是用过就消失的,一般来说是表达式。
2、左值可写可读,右值可读
左值是可读可写的,就是我们既可以读出左值得表达结果,也可以对其进行赋值,但是右值只是可读的,比如,我们不能写3=a这种表达式。
1.3 什么情况是左值,什么情况是右值
什么情况是左值呢?就是说变量都是左值,什么情况是右值呢?一般来说常量或者表达式就是右值,这两者有什么关联呢?常量可以认为是最简单的表达式。
三、左值引用和右值引用
首先说一下,左值引用和右值引用和左值,右值不是一回事,这里不能一概而论。
左值引用和左值得关系:首先,左值引用是左值产生的,就是int &b = a;但是不能写int &b = a+3,同理,右值引用也是一样的。
右值引用和右值得关系:除了上述特性外,右值引用和右值还有一个重要的区别,就是右值引用可以修改值,可以写成 int &&b = a+3,因为右值引用是拥有左值得属性。
两者之间用途的不同:主要是函数方面的区别,左值引用可以用作返回的概念上,但是必须添加&,其余的都是右值。
四、左值引用和右值引用的关系
最后说一下左值引用和右值引用的关系,两者之间可以用std::move来转换。即是:int &&r1 = std::move(rr2);
4. 总结
左值与右值是表达式的属性,也是运算符处理运算对象时对运算对象的要求及返回的结果的属性。右值要么是字面值常量,要么是表达式求值过程中创建的临时对象。左值通常是程序员创建的对象。
左值通常持久,右值通常是编译器创建的临时变量。左值大部分情况下可以修改,右值不可以,有两个例外情况。可以在要求使用右值的地方使用左值代替,有一个例外情况。
左值引用和右值引用是两种复合数据类型,他们都是左值,是C++为了区分开左值和右值创建的。我们可以使用右值引用实现内存的移动操作,避免二次开销。