左引用和右引用 右引用有什么用?

【左引用和右引用 右引用有什么用?】在学习C 在这个过程中会遇到很多难以理解的概念 。今天我们来谈谈C 引用左值和右值 。C 11之前没有左右引用的概念,只有引用的概念 。右引用是由C 11引入,为了便于区分右引用,我们将其引入C 11前的常规引用称为左值引用 。
   什么是左值引用和右值引用?    首先,我们区分什么是左和右,有一个很好的区分左右值的方法,就是能否取表达式地址!!获取地址的表达式是左值,持久变量是左值,反之亦然 。左值引用和右值引用只是对象的别名,左值引用是左值的别名,右值引用是右值的别名 。因此,左引用只能绑定左引用,右引用只能绑定右引用 。我们不能将右引用类型的变量绑定到右引用 。因为变量是左值!我们可以将右引用类型的变量取地址!但是有一个例外,const左值引用可以绑定到右值 。这似乎有点难以理解 。让我们用代码来解释 。
   int i = 42; //i是左值,是的i取地址 int &r = i; //r是左值引用,绑定左值i
   可以对变量i所以取地址i是左值 。
   int &&rr = i; //错误!i是左值,不能绑定到右值引用rr int &&rr3 = rr; //错误!!!!rr是右值引用类型的变量,是左值 。
   由于右不能与右引用类型变量绑定,因为右引用类型变量是左引用,所有持久变量均为左值 。地址变量为持久变量,相反为临时变量 。那么,绑定右值引用类型变量可以用左值引用吗?左值引用绑定左值引用类型变量?当然可以 。我们来看看下面的代码示例 。
   int &r2 = rr; //正确,rr是右值引用型变量,变量为左值 。int &r3 = r; //正确,r是左值引用类型变量,变量都是左值 。
   接下来我们来看看表达式,产生临时变量或字面常量的表达式是右值,反之亦然 。我们仍然以代码为例 。
   int &&rr_result = Add(1,2); //不能取表达式地址,因此表达式结果为右值,可绑定到右值引用 int &&rr2 = i * 42; //不能将表达值取地址,因此表达式结果为右值,可绑定到右值引用 int &&rr1 = 42; //不能取字面常量地址,因此字面常量为右值,可绑定到右值引用
   Add函数产生临时变量,因此为右值 。i * 42产生右值的临时变量 。42是字面常量,所以也是右值 。
   int result = 0; int *ptr = &(result = i * 12); //正确result取地址 int& r3 = (result = i * 12); //正确,表达式结果存储在变量中result中间,表达式地址可以取
   result = i * 12表达式结果存储在result中,可以对result取地址,所以表达式是左值 。
   const int &r2 = i * 42; //表达值不能取地址,因此表达式结果是右值,可以绑定到const左值引用
   i * 42是右值,但是const左值引用类型可绑定到右值 。
   复制与移动的区别    C 有复制结构函数和移动结构函数,复制赋值运算符和移动赋值运算符 。移动和复制之间最大的区别是复制会产生新的内存,而移动不会 。复制获得的对象状态的变化不会影响源对象,而移动获得的对象状态的变化会影响源对象,移动源对象将失去对所有资源的控制!复制将增加内存应用程序和数据复制的成本,而移动程序不会 。
   要实现移动语义,必须有:移动结构函数和移动赋值运算符
   让我们举个例子来学习复制和移动的区别 。