首先说明就是std::forward主要是用来解决在参数传递的过程当中,右值被传递为左值,失去了原来的无拷贝功能。
首先看下面例子:
void myp(int &t) {
std::cout << "lvalue" << std::endl;
}
void myp(int &&t) {
std::cout << "rvalue" << std::endl;
}
//这里说明一下,在模板函数中&&代表的是万能引用,不是大家想的右值引用
template <typename T>
void test(T &&t) {//既能作为左值引用,又能作为右值引用
myp(t);
myp(std::forward<T >(t));
myp(std::forward<T &>(t));//转发为左值
myp(std::forward<T &&>(t));//转发为右值
}
int main() {
test(1);//lvalue rvalue lvalue rvalue
}
这里我们来解释一下:
当调用test(1)的时候,结果是:lvalue rvalue lvalue rvalue
可能觉得奇怪我输入的明明是右值,为什么第一个重载却调用的是左值引用,其实这也是我们为什么要发明完美转发的意义所在,防止右值引用在传递的过程中被转换为左值引用。
再来看下一个:
int main() {
A a;
test(a);//lvalue lvalue lvalue lvalue
}
为什么转发为右值的时候还是左值呢,这是因为转发可以向下转而不能向上转。