万能引用(universal reference/forwarding reference:转发引用)
1类型区别基本含义
1 | template<typename T> |
2universal reference/万能引用/未定义引用基本认识
- 结论:万能引用是一种类型
- 右值引用(全程:右值引用类型)是用&&表示,右值引用绑定在右值上
1 | void myfunc(int&& tmpv) { |
如果我们想一个函数既能接收左值引用又能接收右值引用
1 | template<typename T> |
万能引用离不开两种语境
必须是函数模板
必须是发生模板类型推断并且函数模板形参长这样:T&&;
如果参数传递了一个整型左值传递给形参,tmprv的类型最终会被推断为int&类型
如果参数传递了一个整型右值传递给形参,tmprv的类型最终会被推断为int&&类型
题目:
1 | void func(int&& param) {...}//右值引用 |
std::move把左值转换为右值
1 | template<typename T> |
什么情况才是万能引用
一个是函数模板中用作函数参数的类型推断(参数中主要涉及类型推断)T&&
auto&& tmpvalue=….也是万能引用
其他情况的&&的情形的都是右值引用
1 | template<typename T> |
万能引用资格的剥夺与辨认
剥夺,const会剥夺一个引用成为万能引用的资格,被打回右值成为右值引用
1
2
3
4
5
6
7template<typename T>
void myfunc4(const T&& tmpv) {//有const修饰
cout << tmpv << endl;
}
//nmsp1::myfunc4(i);错误,只能传递右值
myfunc4(std::move(i));辨认
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18template<typename T1>
class mytest {
public:
void testfunc(T1&& x){}
//这个不是万能引用,
template<typename T2>
void testfunc2(T2&& x) {}//x类型是万能引用类型
};
nmsp2::mytest<int> mc;
//mc.testfunc(i);//错误
mc.testfunc(std::move(i));
//因为testfunc成员函数本身没有涉及到类型推断
mc.testfunc2(i);
mc.testfunc2(2);