左值与右值引用 详解

说明

顾明思议

左值引用 就是对左值的引用 就是给左值取别名

右值引用 就是对右值的引用 就是给右值取别名

当改变别名是 该值也相应的改变

那么 何以区分哪些是左值哪些是右值呢?

左值 右值
在内存中有特定地址的量 在寄存器中的量

因为申请的变量会在内存中开辟一块地址 左值也叫有特定地址的量

比如:

int a=10; //a 是左值 double b=1.3; //b 是左值 左值引用 int & Ta=a; //引用左值 故 是一个左值引用 double & Tb=b; //引用左值 故是一个左值引用 

那么 何么 寄存器中的量又是什么?

通俗的说 寄存器量 就是 运算值、函数返回的临时变量或者常量
这些都有一个共同特点 :都不可对其取地址

比如:

'a'  是常量  故为右值
3    是常量  故为右值
1+3 运算会将 1+3 的结果保存至 寄存器 此时并不在特定的内存位置 故 该值为右值 是临时变量 int add() { return 0; } //该函数返回的值并不会保存在内存中 仅出现在临时量中 语句执行完毕后 该临时量被销毁 右值引用 char && a="a"; //常量 int && b=1+3; //临时变量 int&& c= add(); //函数引用 

重点:

不可将左值引用 到 右值

不可将右值引用 到 左值

左值引用实例

#include<iostream> using namespace std; int main(void) { int a=10; //左值 int & In_a=a; //左值引用 cout<<"Old:"<<In_a<<endl; In_a=2; //改变别名 cout<<"New:"<<In_a<<endl; return 0; } 

结果:


当左值引用右值时:

右值引用实例

#include<iostream> using namespace std; int add() { return 0; } //返回常量 0 int fun(int&& f) //形参为右值引用 { cout << f << endl; return 1; } //返回常量 1 int main(void) { 'a'; //常量 'a' 3; //常量 3 1 + 3; //寄存器量 1+3结果 4 //使用右值引用 char && Char_a = 'a'; cout << "'a':" << Char_a << endl; int && Int_a = 3; cout << "3:" << Int_a << endl; int && Int_b = 1 + 3; cout << "1+3:" << Int_b << endl; int &&Int_c = add(); cout << "add()return 0:" << Int_c << endl; int && Int_d = fun(3); //输出3 cout << "fun() 3:" << Int_d << endl; return 0; } 

结果


当右值引用左值时:
在这里插入图片描述

以上为 左值右值引用规则 及使用方法

但 模板引用则不同
这是因为 自动推到类型优化后的结果

如:

#include<iostream> using namespace std; template<typename T> //函数模板 void fun(T&& f) //兼容 左值引用 和右值引用 { cout << f << endl; } int main(void) { int a = 10; fun(a); fun(3); //兼容 左值引用 和右值引用 return 0; } 

结果
在这里插入图片描述

但当我们 提供左值引用版本时 便会优先匹配左值引用版本

猜你喜欢

转载自www.cnblogs.com/tinaluo/p/11440984.html