学习资料网址:
forword函数和&&两者配合起来用,在函数模板里使用
知识点:
<1>forword() 函数模板用于修饰被调用函数中需要维持参数左、右值属性的参数。
<2> && 右值引用
C++11 标准中规定,通常情况下右值引用形式的参数只能接收右值,不能接收左值。
但对于函数模板中使用右值引用语法定义的参数来说,它不再遵守这一规定,既可以接收右值,也可以接收左值(此时的右值引用又被称为“万能引用”)。
在函数模板中:
当实参为左值或者左值引用(A&)时, T&& 将转变为 A&(A& && = A&);
当实参为右值或者右值引用(A&&)时,T&& 将转变为 A&&(A&& && = A&&)。
在实现完美转发时,只要函数模板的参数类型为 T&&,则 C++ 可以自行准确地判定出实际传入的实参是左值还是右值。
#include <iostream>
using namespace std;
//重载被调用函数,查看完美转发的效果
void otherdef(int & t) {
cout << "lvalue\n";
}
void otherdef(const int & t) {
cout << "rvalue\n";
}
//&&和forward的配合
//实现完美转发的函数模板
template <typename T>
void function(T&& t) {
otherdef(forward<T>(t)); //保留了左值和右值
}
int main()
{
function(5);
int x = 1;
function(x);
int && a = 10;
a = 100; //右值引用,可以改变数值
cout << a << endl;
return 0;
}