关键词 : 右值引用
所有函数的形式参数都是左值
void func(Wight&& w) {...};
形参w的类型是右值引用,但是是个左值
针对上面一点,无论传入的实参数是何种类型,形参都是左值,如果函数内部调用其他函数,永远是调用左值版本,使用move调用右值版本,使用forward根据传入类型,调用相应版本。
void fun_1(Wight &w) {...}; // 左值版本
void fun_1(Wight &&w) {...}; // 右值版本
void func(Wight&& w) {
fun_1(w); // 只能调用左值版本
fun_1(std::move(w)); // 一定调用右值版本
fun_1(std::forward(w)); // 根据传入参数类型调用左值还是右值版本
}
forward如何知道传入是左值还是右值?引用折叠
C++一般是不允许定义引用的引用的,但是引用折叠可以
引用折叠的规则:(对于引用的引用)其中任意一个是左值引用,整个就是左值引用,否则(即两者都是右值)才是右值引用
函数参数为万能引用的函数模版,在实例化的时候会根据传入参数的类型确定函数的型别
template<typename T> void func(T&& param){...};
// 1. 传入左值,模版具化为:
void func(T& && param) {...};
此时param的类型是指向左值引用的右值引用,引用折叠之后是左值引用。
// 2. 传入右值时候:
void func(T&& && param) {...};
此时param的类型是指向右值的右值引用,引用折叠之后是右值引用。