引用型别未定义
用模板时,一下这种传参左值引用、右值引用、常引用都可以调用:
template<class T>
void func(T&& x)
{
print(x);
}
int main()
{
int a = 10;
const int b = 10;
func(a);
func(b);
func(10);
}
其中:
a传入时:T为int&类型,x为int&类型
b传入时:T为const int&类型,x为const int&类型;
10传入时:T为int类型,x为int&&类型
完美转发
首先看一个不完美的转发:下面的代码间接传递参数,其中右值引用通过func后有了名字 x ,之后被当作左值引用传给print。
void funa(int && a){}
void print(int& x)
{
cout << "左值引用" << endl;
}
void print(const int& x)
{
cout << "常性左值引用" << endl;
}
void print(int&& x)
{
cout << "右值引用" << endl;
}
template<class T>
void func(T&& x)
{
print(x);
}
int main()
{
int a = 10;
const int b = 20;
func(a);
func(30);//30在func中有名字了:a,从右值变成左值
return 0;
}
当通过完美转发std::forward<T>(x),就可以避免右值在传值的过程中变成左值
void func(T&& x)
{
print(std::forward<T>(x));
}
完美转发使函数调用过程中变量的值类别保持不变。