# 右值引用
# 万能引用
根据传入变量的类型决定是左 / 右值引用
常见场景 函数模板的参数 T&& auto &&
# 引用折叠
引用的引用一般只会在类型别名或者模板类型参数中出现
除了右值引用的右值引用,其他引用的引用都会折叠为左值引用
# 完美转发
当我们将一个右值引用传入函数时,他在实参中有了命名,所以继续往下传或者调用其他函数时,根据 C++ 标准的定义,这个参数变成了一个左值。那么他永远不会调用接下来函数的右值版本,这可能在一些情况下造成拷贝。为了解决这个问题 C++ 11 引入了完美转发,根据右值判断的推导,调用 forward 传出的值,若原来是一个右值,那么他转出来就是一个右值,否则为一个左值。
这样的处理就完美的转发了原有参数的左右值属性,不会造成一些不必要的拷贝。
对于右值引用使用 std::move,对于万能引用使用 std::forward
std::move 对于一个本身是左值的右值引用变量需要绑定到一个右值上 , 即将左值强制转换为右值
std::forward 如果一个本身是左值的万能引用如果绑定在了一个右值上面,就把它重新转换为右值