什么是左值和右值
左值程序能够在执行下一行代码的时候还能调用其地址的值,表现为变量,指正...
右值,又称将亡值,系统在执行完右值所在行的代码后无法再调用其地址的值,列入 int a = 5;
其中的 5 就是左值,程序在下一行无法拿到其地址;
int a = 4;
左值引用 int &b = a;
右值应用 int &&b = 5;
引用折叠
简单的来说,引用折叠是将多个引用用符号折叠为少量的折叠为单纯的左值和右值引用:当引用符号为奇数个时,折叠为左值引用,当应用符号为偶数个时,折叠为右值引用
万能引用
和普通函数有相似,但是万能引用的重心是:传入变量是左值还是右值
万能引用的核心是函数模版与引用折叠,使不管左值右值都能传入使用
void Test(int& a){
cout<< "Left Value" << endl;
}
void Test(int&& a){
cout<< "Right Value" <<endl;
}
// 万能引用
template<typename T>
void Test123(T&& a){
cout<< a << endl;
}
int main(){
int a = 2;
Test(a);
// 输出:Left Value
Test(3);
// 输出:Right Value
Test123(a);
// 输出a的值
Test123(2);
// 输出值2
}
完美转发
当函数值传入为左值时,在函数体中体现的方式也是左值,并不会改变
在使用万能引用的时候再函数体中,传入值会被转换为左值
void Test(int& a){
cout<< "Left Value" << endl;
}
void Test(int&& a){
cout<< "Right Value" <<endl;
}
// 万能引用
template<typename T>
void Test123(T&& a){
Test(a);
}
int main(){
int a = 2;
Test123(a);
// 输出:Left Value
Test123(2);
// 输出:Left Value
}
完美转发的要点是使用forward函数
// 万能引用 完美转发
template<typename T>
void Test123(T&& a){
Test(forward<T>(a));
}
完美转发主要是先利用函数模版对T进行推导,在利用forward函数将传入的参数转换为对应的左右值属性。