EasyC++?右值引用
文章轉(zhuǎn)自:公眾號(hào):Coder梁(ID:Coder_LT)
1.左值和右值
在我們之前的文章當(dāng)中,介紹的都是左值引用。C++11在左值引用的基礎(chǔ)上推出了右值引用,由于是新特性,加上使用的頻率也不是很高,有一定的學(xué)習(xí)成本。
我們先把引用這個(gè)概念拋開,先來看看什么是左值什么是右值。其實(shí)很簡單,左值可以取地址,位于等于號(hào)的左側(cè)。而右值沒辦法取地址,位于等于號(hào)的右側(cè)。
int a = 4;
比如我們定義了一個(gè)int型的變量a,讓它的值等于4。其中a位于等于號(hào)的左側(cè),并且我們可以求a的地址。而4位于等于號(hào)的右側(cè),我們沒有辦法對(duì)4取地址。所以a是左值,4是右值。
再比如:
int test() { return 4; } int a = test();
同樣,a位于等于號(hào)的左側(cè),有辦法取地址是個(gè)左值。而test()是一個(gè)臨時(shí)值沒辦法取地址,是個(gè)右值。
所以到這里就比較清楚了,有地址的變量就是左值,沒有地址的常量值、臨時(shí)變量就是右值。
2.左值引用和右值引用
明白了左值、右值的概念再來看看左值引用、右值引用就簡單了。左值引用顧名思義就是能夠指向左值不能指向右值的引用。
int a = 4; int &b = a; // 合法 int &c = 4; // 非法
但是左值引用也有例外,就是使用const修飾的左值引用是可以指向右值的:
const int &b = 4;
因?yàn)閏onst修飾的引用無法再更改,所以可以指向右值。如果大家度過STL代碼的話,會(huì)發(fā)現(xiàn)其中一些函數(shù)的入?yún)⑹莄onst &目的就是為了能夠兼容傳參是常量的情況。比如vector
當(dāng)中的push_back
:
void push_back (const value_type& val);
右值引用和左值引用的概念類似,也就是能夠指向右值但不能指向左值的引用。為了和左值引用區(qū)別, 使用&&也就是兩個(gè)&符。老實(shí)講這個(gè)符號(hào)很令人費(fèi)解,因?yàn)樗?code>and的含義相同。
int a = 4; int &&b = 4; // 合法 int &&c = a; // 非法
上面第三行代碼非法的原因是c是一個(gè)右值引用,它不能指向左值。如果我們非要指向呢?也不是沒有辦法,可以使用std::move
函數(shù),它可以將一個(gè)左值轉(zhuǎn)換成右值。
using namespace std; int a = 4; int &&c = move(a);
move
函數(shù)聽起來似乎是移動(dòng)的意思,但其實(shí)它并沒有移動(dòng)變量,只不過做了一個(gè)類似于類型轉(zhuǎn)換的操作。
不知道大家看到這里有沒有覺得頭大,其實(shí)還沒有結(jié)束,還有一點(diǎn)很重要。即左值引用和右值引用這兩者本身都是左值引用:
void test(int && tmp) { tmp = 2333; } using namespace std; int a = 4; int &b = a; int &&c = 4; test(a); // 非法 test(b); // 非法 test(c); // 非法 test(move(a));// 合法 test(move(b));// 合法 test(move(c));// 合法
C++中的引用是一個(gè)非常大的范疇,除了左值引用、右值引用之外還有非常多的細(xì)節(jié)。比如萬能引用、引用折疊、完美轉(zhuǎn)發(fā)等……
到此這篇關(guān)于C++ 右值引用的文章就介紹到這了,更多相關(guān)右值引用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Matlab實(shí)現(xiàn)人工神經(jīng)網(wǎng)絡(luò)(ANN)回歸的示例詳解
這篇文章主要為大家詳細(xì)介紹了Matlab實(shí)現(xiàn)人工神經(jīng)網(wǎng)絡(luò)(ANN)回歸的相關(guān)資料,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-02-02C++基于EasyX框架實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲
EasyX是針對(duì)C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。本文將利用EasyX框架實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲,需要的可以參考一下2023-01-01C++中的四個(gè)默認(rèn)成員函數(shù)與運(yùn)算符重載詳解
這篇文章主要給大家介紹了關(guān)于C++中四個(gè)默認(rèn)成員函數(shù)與運(yùn)算符重載的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08OpenCV實(shí)現(xiàn)Sobel邊緣檢測的示例
本文主要介紹了OpenCV實(shí)現(xiàn)Sobel邊緣檢測的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08一篇文章帶你入門C語言數(shù)據(jù)結(jié)構(gòu):緒論
這篇文章主要介紹了C語言的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛好者有所幫助,同時(shí)祝大家有一個(gè)好成績,需要的朋友可以參考下,希望能給你帶來幫助2021-08-08