1. 程式人生 > 實用技巧 >左值引用與右值引用

左值引用與右值引用


author: lunar
date: Wed 23 Sep 2020 06:31:43 PM CST

左值引用與右值引用

左值:可以取地址的,有名字的,非臨時的就是左值;

右值:不能取地址,沒有名字的,臨時的就是右值。

左值的英文縮寫為"lvalue", 右值的英文縮寫為"rvalue"。這並非很多人認為的"left value"和"right value"。而是"localtor value"和"read value",分別表示可以在記憶體中找到的值和只能提供數值的值。

左值引用即我們常見的定義引用的方式,引用就相當於變數的別名。

左值引用要求右值必須能夠取地址,如果不能取地址,則必須為常引用。

因為左值引用本質上是將地址賦給左值,所以下面的這種語句不能出現:
int &b = a + 1;

因為a+1不能被認為一個在記憶體中存在地址的變數,它只是一個數。當然如果加上const修飾符就可以了。

又或者下面這種:

int func() {
    return 0;
}

int &i = func();

函式func()的返回值也是右值,在記憶體中沒有具體的地址。

那如果我們想要儲存一個函式的返回值的話,要麼通過常引用,要麼不適用引用。前者導致引用不可修改,後者常常會帶來大代價的拷貝函式呼叫。

如果我們即想引用可以修改,又想不帶來記憶體拷貝的代價的話,就可以使用右值引用了。

右值引用的定義格式如下:
型別 &&引用名 = 右值表示式;

右值引用可以延長臨時變數的生存週期,避免了無謂的記憶體複製操作。