[2] 右值引用:
C++中,左值通常指可以取地址,有名字的值就是左值,而不能取地址,没有名字的就是
右值。而在指C++11中,右值是由两个概念构成:将亡值和纯右值。纯右值是用于识别临
时变量和一些不跟对象关联的值,比如1+3产生的临时变量值,2、true等,而将亡值通常
是指具有转移语义的对象,比如返回右值引用T&&的函数返回值等。
C++11中,右值引用就是对一个右值进行引用的类型。由于右值通常不具有名字,所以我们一般只能通过右值表达式获得其引用,比如:
T && a=ReturnRvale();
假设ReturnRvalue()函数返回一个右值,那么上述语句声明了一个名为a的右值引用,其值等于ReturnRvalue函数返回的临时变量的值。
基于右值引用可以实现转移语义和完美转发新特性。
转移语义:
对于一个包含指针成员变量的类,由于编译器默认的拷贝构造函数都是浅拷贝,
所有我们一般需要通过实现深拷贝的拷贝构造函数,为指针成员分配新的内存
并进行内容拷贝,从而避免悬挂指针的问题。
完美转发:
完美转发是指在函数模板中,完全依照模板的参数的类型,将参数传递给函数模
板中调用的另一个函数,即传入转发函数的是左值对象,目标函数就能获得左值
对象,转发函数是右值对象,目标函数就能获得右值对象,而不产生额外的开销
。因此转发函数和目标函数参数一般采用引用类型,从而避免拷贝的开销。其次
,由于目标函数可能需要能够既接受左值引用,又接受右值引用,所以考虑转发
也需要兼容这两种类型。