1. 程式人生 > 其它 >第1年7月9日 淺析C++11右值引用和move語義

第1年7月9日 淺析C++11右值引用和move語義

1.

右值:只可以放在等號右側的變數。例如下面的例子:

1 2 3 4 int a = 1; int b = a + 2; int& c = a + 2; //error a+2 = 3; // error

這裡的a+2只能放在等好的右側,所以a+2是右值。

為什麼a+2只能放在等號右側呢?原因在於a+2會產生一個臨時變數,b=a+2實際上是先算出a+2的結果儲存到臨時變數然後賦值給b,並銷燬這個臨時變數。如果將a+2放到等好的左側,那麼將產生無意義的結果。

綜合上面的左值和右值的概念我們可以得到“左值持久,右值短暫”的概念。左值持久存在,右值將在運算結束後銷燬。

0x02 右值引用

上面已經介紹了右值的概念,從右值引用的名字上可以看出,右值引用就是對右值進行引用操作。例子如下:

1 2 3 int a = 1; //int& b = a + 2; //error int&& b = a + 2;

我們使用兩個與符號表示右值引用,從上面的例子中可以看出,普通的引用的等號右側不可以是一個右值,而右值引用的左側必須是一個右值。那麼中間道理髮生了什麼呢?其實右值引用指向的是將要銷燬的物件,也就是前面提到的a+2產出的臨時物件,在物件銷燬之前該引用可以接管其資源。

有些時候我們偏偏需要將左值轉換為右值引用怎麼辦呢?ok move語義登場。

0x03 move語義

從上面的介紹我們可以總結出,只有右值可以繫結到右值引用上。但是,話不能說的太慢。我們總有辦法能將左值也繫結到右值引用上,我們可以顯式的使用move將一個左值轉換為對用的右值引用型別。如下:

1 2 int a = 1; int&& b = std::move(a);

此時,a和b的地址是相同的,b將是a的應用。

總結出來move的概念其實很簡單,就一句話:將一個左值轉換為對用的右值引用型別。

這裡需要注意一點的就是,右值引用的是將要銷燬的物件,使用move呼叫意味著告訴編譯器我們有一個左值,但想像右值一樣使用,所以呼叫move後原來的物件除了賦值和銷燬它外不能有其他的操作(書上是這麼說的,但是測試的時候未發現問題)。

https://www.k2zone.cn/?p=1880

https://www.cnblogs.com/exciting/p/11156900.html