目錄
在我們之前的文章當中,介紹的都是左值引用。c++11在左值引用的基礎上推出了右值引用,由於是新特性,加上使用的頻率也不是很高,有一定的學習成本。
我們先把引用這個概念拋開,先來看看什麼程式設計客棧是左值什麼是右值。其實很簡單,左值可以取位址,位於等於號的左側。而右值沒辦法取位址,位於等於號的右側。
int a = 4;
比如我們定義了乙個int型的變數a,讓它的值等於4。其中a位於等於號的左側,並且我們可以求a的位址。而4位於等於號的右側,我們沒有辦法對4取位址。所以a是左值,4是右值。
再比如:
int test()
int a = test();
同樣,a位於等於號的左側,有辦法取位址是個左值。而test()是乙個臨時值沒辦法取位址,是個右值。
所以到這裡就比較清楚了,有位址的變數就是rpduxaybnh左值,沒有位址的常量值、臨時變數就是右值。
明白了左值、右值的概念再來看看左值引用、右值引用就簡單了。左值引用顧名思義就是能夠指向左值不能指向右值的引用。
int a = 4;
int &b = a; // 合法
int &c = 4; // 非法
但是左值引用也有例外,就是使用const修飾的左值引用是可以指向右值的:
const int &b = 4;
因為const修飾的rpduxaybnh引用無法再更改,所以可以指向右值。如果大家度過stl**的話,會發現其中一些函式的入參是const &目的就是為了能夠相容傳參是常量的情況。比如vector當中的push_back:
void push_back (const value_type& val);
右值引用和左值引用的概念類似,也就是能夠指向右值但不能指向左值的引用。為了和左值引用區別, 使用&&也就是兩個&符。老實講這個符號很令人費解,因為它和and的含義相同。
int a = 4;
int &&b = 4; // 合法
int &&c = a; // 非法
上面第三行**非法的原因是c是乙個右值引用,它不能指向左值。如果我們非要指向呢?也不是沒有辦法,可以使用std::move函式,它可以將乙個左值轉換成右值。
using namespace std;
int a = 4;
int &&c = move(a);
move函式聽起來似乎是移動的意思,但其實它並沒有移動變數,只不過做了乙個類似於型別轉換的操作。
不知道大家看到這裡有沒有覺得頭大,其實還沒有結束,還有一點很重要。即左值引用和右值引用這兩者本身都是左值引用:
void test(int && tmp)
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++中的引用是乙個非常大的範疇,除了左值引用、右值引用之外還有非常多的細節。比程式設計客棧如萬能引用、引用摺疊、完美**等……
c 左值 右值 右值引用 左值引用
c 裡一切值必須屬於左值 右值兩者之一。左值 一切變數 包括用const修飾的變數 物件 包括引用都屬於左值 右值 一切字面值 可以是巨集 臨時無名物件 函式返回值 表示式 如a n 說明一下 函式返回值,返回的是某乙個型別的值,並不是返回變數。左值並不是說能放在 左邊的值就是左值 雖然用const...
c 左值 右值 左值引用 右值引用
在c語言中,左值認為是賦值語句的左側,右值認為是賦值語句的右側。在c 中,意義稍有不同。c 中,每乙個表示式會產生乙個左值或者右值,相應的,該表示式也就被稱作 左值表示式 右值表示式 乙個左值表示式的求值結果是乙個物件或者是乙個函式。左值可以當右值使用,而右值不能當左值使用。c prime 中這麼簡...
C 左值 右值 左值引用 右值引用
就變數而言,對於一些變數,我們只會讀取並使用它們的值,而不會改變他們的值 唯讀 對於其餘的變數,我們既會讀取它們的值,有的時候還會改變它們的值 讀寫 這是很常見的。在c 中,前一種變數稱為右值,後一種變數稱為左值,例如 int a 1 a是左值,1是右值稍稍不同的一點是,在c 中,乙個變數是左值還是...