C 中的左值和右值

2021-10-25 16:22:47 字數 1271 閱讀 8332

定義:引用:就是變數的乙個別名,它用作物件的另乙個名字。類似指標。

#include

using

namespace std;

通俗地說,以賦值符號 = 為界,= 左邊的就是左值,= 右邊就是右值。

左值(lvalue)是乙個表示式,它表示乙個可被標識的(變數或物件的)記憶體位置,並且允許使用&操作符來獲取這塊記憶體的位址。如果乙個表示式不是左值,那它就被定義為右值。

左值引用的宣告是通過在某個型別後放置乙個符號&來進行的。

std::string s;

std::string& sref = s;

//sref為左值引用

需要注意的是,在定義左值引用時,=右邊的要求是乙個可修改的左值。因此下面幾種左值引用都是錯誤的:

#include

intmain()

類似於左值引用,右值引用便是對右值的引用,它是通過兩個&&來宣告的。

注意:對於基礎型別,右值是不可被修改的(non-modifiable),也不可被 const, volatile 所修飾(cv-qualitification ignored)

對於自定義的型別(user-defined types),右值卻允許通過它的成員函式進行修改。

#include

intmain()

在c++11中,標準庫在中提供了乙個有用的函式std::move,std::move並不能移動任何東西,它唯一的功能是將乙個左值強制轉化為右值引用,繼而可以通過右值引用使用該值,以用於移動語義。也就是說,是將物件的狀態或者所有權從乙個物件轉移到另乙個物件,只是轉移,沒有記憶體的搬遷或者記憶體拷貝所以可以提高利用效率,改善效能.。

舉個c++stl中std::swap的原始碼例子:

void

swap

(vector

& x, vector

& y)

右值值引用通常不能繫結到任何的左值,要想繫結乙個左值到右值引用,通常需要std::move()將左值強制轉換為右值,例如:

int a;

int&&r1 = a; # 編譯失敗

int&&r2 = std::

move

(a); # 編譯通過

int&&r2 =

2; # 編譯通過

參考:

C 中的左值和右值

1.概念變數和文字常量都有儲存區,並且有相關的型別,區別在於變數是可定址的 對於每個變數,都有2個值與其相關聯 1 資料值,儲存在某個記憶體位址中,也稱右值 rvalue 右值是被讀取的值 read value 文字常量和變數都可被用於右值。2 位址值,即儲存資料值的那塊記憶體位址,也稱左值 lva...

c 中的左值和右值

左值 lvalue 右值 rvalue 是 c c 中乙個比較晦澀的概念,有的人可能甚至沒有聽過,但這個概念到了 c 11 後卻變得十分重要,它們是理解move forward 等新語義的基礎。左值與右值這兩概念是從c中傳承而來的,在c中,左值指的是能夠出現在等號左邊及右邊的變數 表示式 右值則指的...

C 中的左值和右值

左值 lvalue 應該被解釋被location value,即可被定址的值 右值 rvalue 應該被解釋為read value,即唯讀的值,而不能被定址 這樣理解應該更為準確一點 通俗的講,左值就是能夠出現在賦值符號左面的東西,而右值就是那些可以出現在賦值符號右面的東西了。舉個很簡單的例子 a ...