Demo(Demo&& lre):arr(lre.arr),size(lre.size)({lre.arr=NULL;}
lre是一个右值引用,通过它间接访问实参(临时对象)的资源来完成资源转移,lre绑定的对象(必须)是右值,但lre本身是左值;
因为lre是函数的局部对象,”lre.arr=NULL"必不可少,否则函数结尾调用析构函数销毁lre时仍然会将资源释放,转移的资源还是被系统收回.
4. move()函数
3中的例子并非万能,Demo(Demo&& lre)的实参必须是右值,有时候一个左值即将到达生存期,但是仍然想要使用转移语义接管它的资源,这时就需要move函数.
std::move函数定义在标准库<utility>中,它的作用是将左值强行转化为右值使用,从实现上讲,std:move等同于static_cast<T&&>(lvalue) ,由此看出,被转化的左值本身的生存期和左值属性并没有被改变,这类似于const_cast函数.因此被move的实参应该是即将到达生存期的左值,否则的话可能起到反面效果.
5. 完美转发(perfect forwarding)
完美转发指的是将一组实参"完美"地传递给形参,完美指的是参数的const属性与左右值属性不变,例如在进行函数包装的时候,func函数存在下列重载:
void func(const int);
void func(int);
void func(int&&);
如果要将它们包装到一个函数cover内,以实现:
void cover(typename para){
func(para);
}
使得针对不同实参能在cover内调用相应类型的函数,似乎只能通过对cover进行函数重载,这使代码变得冗繁,另一种方法就是使用函数模板,但在C++ 11之前,实现该功能的函数模板只能采用值传递,如下:
template<typename T>
void cover(T para){
...
func(para);
...
}
但如果传递的是一个相当大的对象,又会造成效率问题,要通过引用传递实现形参与实参的完美匹配(包裹const属性与左右值属性的完美匹配),就要使用C++ 11 新引入的引用折叠规则:
函数形参 T的类型 推导后的函数形参
T& A& A&
T& A&& A&










