前言:
Vue框架:
从项目学Vue
OJ算法系列:
神机百炼 - 算法详解
Linux操作系统:
风后奇门 - linux
万能引用:
定义:
模板中的&&引用:
template <class T>
void PerfectForward(T &&t){
}
- 模板中的&&:
- 不代表右值引用
- 而是双值引用:可左值引用,可右值引用
- 问题:
- 使用模板将数据引入时不区分左值 / 右值
- 之后再使用模板形参时,可能需要区分是左值还是右值
使用:
- 猜猜下面的函数调用结果:
template <typename T>
void func(int &t){
cout<<"左值引用"<<endl;
}
void func(int &&t){
cout<<"右值引用"<<endl;
}
void PerfectForward(T &&t){
func(t);
}
int main(){
PerfectForward(10);
int a;
PerfectForward(a);
PerfectForward(std::move(a));
const int b = 10;
PerfectForward(b);
PerfectForward(std::move(b));
return 0;
}
- 结果:全部都归属了左值引用
- 原因分析:右值的引用可以取地址,是左值
缺点:
- 使用模板引用只能说是可以接收左值也可以接收右值,
考虑后续继续引用内容时需要区分左值右值,还远远达不到“万能引用”。 - 比C++98中的const &多了写的功能。
forward():
用法:
- 加在双引用变量前,可以确定双引用变量究竟属于左值引用还是右值引用
template <class T>
void PerfectForward(T &&t){
func(std::forward<T>(t));
}
- 现在再调用func(&)和func(&&),发现出现了右值引用
作用:
- 单纯一重引用,可能对左右值引用要求区分不严格
- 但是多重引用,对左右值区分比较严格时,forward<T>()函数可以帮助我们区分左右值引用