一.再探左右值引用1.左右值引用的优势(面试题)①.减少拷贝提升效率。②.左值引用可以对参数或者返回值进行修改。2.左值引用的缺憾以及解决方案①.缺憾②.解决方案Ⅰ.用输出型参数即把返回值放到参数列表里。劣势在于可读性差。Ⅱ.编译器优化传值返回(c11出现前的优化)一代优化把拷贝两步并作一步省去临时对象调函数用str给ret拷贝构造一次到位。二代优化很激进直接省去了拷贝构造让函数返回值变成ret的别名相当于直接用函数构造ret。但编译器优化可操作的空间很小到二代几乎就是极限了。Ⅲ.新标准(前情参见c11(一)的右值引用的使用场景部分)这里补充一下整个过程③.c11出现前后(有无移动构造与移动赋值)解决方案的对比有移动构造与移动赋值以后既确保的可读性(形式上与之前走拷贝构造的代码相同)也增加了效率。④.哪些对象适合实现移动构造与移动赋值深拷贝的自定义类型不仅要把数据搬过来还要涉及空间交换因此开销很大有必要实现移动构造和移动赋值。而浅拷贝的自定义类型的拷贝是逐字节拷贝开销与移动构造和移动赋值相差不大因此不需要实现。3.引用折叠那么折叠引用的规则就是两次引用都必须是右值引用才能让最终引用结果为右值引用。用武之地当T为int时对x引用的结果是左值引用T为int时对x引用的结果是右值引用。所以无论T是左值引用还是优质引用通过折叠引用T x都能接收。而当T为普通类型例如int时不发生折叠引用此时对x的引用就只是右值引用。所以以后写函数模板的参数时写一个T,就可以通过引用折叠既可以实例化成左值版本也可以实例化成右值版本增加了通用性。推导但在实际运用的过程中是不需要传模板参数类型的只需要给个实参系统就能自动推导最终引用是哪一种引用。4.完美转发①.退化②.完美转发