左值引用與右值引用
阿新 • • 發佈:2020-09-23
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()
的返回值也是右值,在記憶體中沒有具體的地址。
那如果我們想要儲存一個函式的返回值的話,要麼通過常引用,要麼不適用引用。前者導致引用不可修改,後者常常會帶來大代價的拷貝函式呼叫。
如果我們即想引用可以修改,又想不帶來記憶體拷貝的代價的話,就可以使用右值引用了。
右值引用的定義格式如下:
型別 &&引用名 = 右值表示式;
右值引用可以延長臨時變數的生存週期,避免了無謂的記憶體複製操作。