C++ 右值引用
文章轉自:公眾號:Coder梁(ID:Coder_LT)
1.左值和右值
在我們之前的文章當中,介紹的都是左值引用。C++11在左值引用的基礎上推出瞭右值引用,由於是新特性,加上使用的頻率也不是很高,有一定的學習成本。
我們先把引用這個概念拋開,先來看看什麼是左值什麼是右值。其實很簡單,左值可以取地址,位於等於號的左側。而右值沒辦法取地址,位於等於號的右側。
int a = 4;
比如我們定義瞭一個int型的變量a,讓它的值等於4。其中a位於等於號的左側,並且我們可以求a的地址。而4位於等於號的右側,我們沒有辦法對4取地址。所以a是左值,4是右值。
再比如:
int test() { return 4; } int a = test();
同樣,a位於等於號的左側,有辦法取地址是個左值。而test()是一個臨時值沒辦法取地址,是個右值。
所以到這裡就比較清楚瞭,有地址的變量就是左值,沒有地址的常量值、臨時變量就是右值。
2.左值引用和右值引用
明白瞭左值、右值的概念再來看看左值引用、右值引用就簡單瞭。左值引用顧名思義就是能夠指向左值不能指向右值的引用。
int a = 4; int &b = a; // 合法 int &c = 4; // 非法
但是左值引用也有例外,就是使用const修飾的左值引用是可以指向右值的:
const int &b = 4;
因為const修飾的引用無法再更改,所以可以指向右值。如果大傢度過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) { 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++中的引用是一個非常大的范疇,除瞭左值引用、右值引用之外還有非常多的細節。比如萬能引用、引用折疊、完美轉發等……
到此這篇關於C++ 右值引用的文章就介紹到這瞭,更多相關右值引用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 一篇文章帶你瞭解C++(STL基礎、Vector)
- 帶你瞭解C++中vector的用法
- 關於C++中push_back()函數的用法及代碼實例
- C++示例講解vector容器
- C++之vector容器的的聲明初始化和增刪改查