左值與右值引用 詳解


說明

顧明思議

左值引用 就是對左值的引用 就是給左值取別名

右值引用 就是對右值的引用 就是給右值取別名

當改變別名是 該值也相應的改變

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

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

因為申請的變量會在內存中開辟一塊地址 左值也叫有特定地址的量

比如:

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; } 

結果
在這里插入圖片描述

但當我們 提供左值引用版本時 便會優先匹配左值引用版本


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM