溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++右值如何引用

發(fā)布時間:2021-12-16 15:05:34 來源:億速云 閱讀:106 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“C++右值如何引用”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

1.左值和右值

在我們之前的文章當(dāng)中,介紹的都是左值引用。C++11在左值引用的基礎(chǔ)上推出了右值引用,由于是新特性,加上使用的頻率也不是很高,有一定的學(xué)習(xí)成本。

我們先把引用這個概念拋開,先來看看什么是左值什么是右值。其實很簡單,左值可以取地址,位于等于號的左側(cè)。而右值沒辦法取地址,位于等于號的右側(cè)。

int a = 4;

比如我們定義了一個int型的變量a,讓它的值等于4。其中a位于等于號的左側(cè),并且我們可以求a的地址。而4位于等于號的右側(cè),我們沒有辦法對4取地址。所以a是左值,4是右值。

再比如:

int test() {
    return 4;
}

int a = test();

同樣,a位于等于號的左側(cè),有辦法取地址是個左值。而test()是一個臨時值沒辦法取地址,是個右值。

所以到這里就比較清楚了,有地址的變量就是左值,沒有地址的常量值、臨時變量就是右值。

2.左值引用和右值引用

明白了左值、右值的概念再來看看左值引用、右值引用就簡單了。左值引用顧名思義就是能夠指向左值不能指向右值的引用。

int a = 4;
int &b = a;  // 合法
int &c = 4;  // 非法

但是左值引用也有例外,就是使用const修飾的左值引用是可以指向右值的:

const int &b = 4;

因為const修飾的引用無法再更改,所以可以指向右值。如果大家度過STL代碼的話,會發(fā)現(xiàn)其中一些函數(shù)的入?yún)⑹莄onst &目的就是為了能夠兼容傳參是常量的情況。比如vector當(dāng)中的push_back

void push_back (const value_type& val);

右值引用和左值引用的概念類似,也就是能夠指向右值但不能指向左值的引用。為了和左值引用區(qū)別, 使用&&也就是兩個&符。老實講這個符號很令人費解,因為它和and的含義相同。

int a = 4;
int &&b = 4; // 合法
int &&c = a; // 非法

上面第三行代碼非法的原因是c是一個右值引用,它不能指向左值。如果我們非要指向呢?也不是沒有辦法,可以使用std::move函數(shù),它可以將一個左值轉(zhuǎn)換成右值。

using namespace std;
int a = 4;
int &&c = move(a);

move函數(shù)聽起來似乎是移動的意思,但其實它并沒有移動變量,只不過做了一個類似于類型轉(zhuǎn)換的操作。

不知道大家看到這里有沒有覺得頭大,其實還沒有結(jié)束,還有一點很重要。即左值引用和右值引用這兩者本身都是左值引用:

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++中的引用是一個非常大的范疇,除了左值引用、右值引用之外還有非常多的細節(jié)。比如萬能引用、引用折疊、完美轉(zhuǎn)發(fā)等……

“C++右值如何引用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI