二十五、C++的左值和右值、C++移动语义
本部分讨论一些更高级的C++特性
C++移动语义
move语义是如何工作的
stdmove与移动赋值操作符
1、C++的左值和右值、左值引用和右值引用
左值是有地址的值(located value),就是左值是有地址的。
左值大部分情况下是在等号的左边,右值在右边。
右值是一些,比如字面量、函数的一些返回结果等:
如果我通过返回int&,把上面的func函数的返回整成左值,会是什么情况?这里也引出什么是左值引用:
再看一个使用字符串的例子:
那有什么方法来检测某个值是左值还是右值吗?这里也引出什么是右值引用?
所以此时我们写个重载函数:
小结:
左值引用用一个&符号,右值引用则是用两个&&符号。
左值是带地址的数据,就是有存储支持的变量。右值是临时值,可以用右值引用&&来检测。
左值引用只能引用(接受)左值,除非加const,就也可以引用(接受)右值了。
右值引用只能应用(接受)右值。
左值、右值有什么用处呢?
尤其是在移动语义方面非常有用。移动语义我们后面还要讲。这里主要是想说分清左右值的目的在于优化。如果我们知道传入的是一个临时对象的话,我们就不需要担心它们是否活着、是否完整、是否拷贝,我们可以简单的偷用它的资源,给到特定的对象,或者在其他地方使用它们,因为我们知道它是暂时的,它不会存在很长时间,比如上面的ln+fn,就是暂时的,我们就可以从这个临时值中偷取资源,这对优化有很大帮助。能用右值就别用左值。所以有很多代码使用&&时,我们要知道这是右值引用。
2、C++移动语义
待续。。。。