左值 ,就是指可以被取地址的表示式。簡單的說,可以出現在等號左邊的就是左值。比如: 另外也可以有不是變數的左值: 這裡,getRef()返回的是一個全域性變數的引用,它的值存在固定的位置,因此是一個左值。 右值 ,則指的是沒有名字的值,它們只出現表示式的計算過程中,也就是等號的右邊。例如: getName()返回一個在函式中構造的字串。你可以把它的值賦給一個變數,但是它是一個臨時物件,我們並不知道它的值放在哪裡。所以,getName()是一個右值。 說清楚了什麼是左值和右值,那麼什麼是右值引用呢?右值引用 是C++11中新引入,是一種只繫結與右值的引用。區別與左值引用(&),它用&&來表示。與左值引用一樣,它也可以是const或者是非const的,但是我們基本不會在實際應用中用到const的右值引用(這個大家可以思考一下為什麼)。讓我們來看一些例子: 從例子中,我們可以看到const的左值引用可以繫結到右值,非const的左值引用不能繫結到右值,右值引用可以繫結到右值。那麼右值引用怎麼幫助我們解決問題呢?讓我們接著看右值引用在作為函式引數時的行為。假如我有下面兩個函式: 第一個printReference函式是用const左值引用作為引數,從前面的例子中我們知道它既可以接受左值也可以接受右值。但是當有了第二個printReference的用右值引用的過載之後,右值將優先繫結到第二個printReference。這點我們可以透過如下程式碼來驗證: 輸出為:
左值 ,就是指可以被取地址的表示式。簡單的說,可以出現在等號左邊的就是左值。比如: 另外也可以有不是變數的左值: 這裡,getRef()返回的是一個全域性變數的引用,它的值存在固定的位置,因此是一個左值。 右值 ,則指的是沒有名字的值,它們只出現表示式的計算過程中,也就是等號的右邊。例如: getName()返回一個在函式中構造的字串。你可以把它的值賦給一個變數,但是它是一個臨時物件,我們並不知道它的值放在哪裡。所以,getName()是一個右值。 說清楚了什麼是左值和右值,那麼什麼是右值引用呢?右值引用 是C++11中新引入,是一種只繫結與右值的引用。區別與左值引用(&),它用&&來表示。與左值引用一樣,它也可以是const或者是非const的,但是我們基本不會在實際應用中用到const的右值引用(這個大家可以思考一下為什麼)。讓我們來看一些例子: 從例子中,我們可以看到const的左值引用可以繫結到右值,非const的左值引用不能繫結到右值,右值引用可以繫結到右值。那麼右值引用怎麼幫助我們解決問題呢?讓我們接著看右值引用在作為函式引數時的行為。假如我有下面兩個函式: 第一個printReference函式是用const左值引用作為引數,從前面的例子中我們知道它既可以接受左值也可以接受右值。但是當有了第二個printReference的用右值引用的過載之後,右值將優先繫結到第二個printReference。這點我們可以透過如下程式碼來驗證: 輸出為: