C 中的左值和右值

2021-08-07 15:21:04 字數 1809 閱讀 5529

在c++中,可以放到賦值操作符=左邊的是左值,可以放到賦值操作符右邊的是右值。有些變數既可以當左值又可以當右值。進一步來講,左值為lvalue,其實l代表location,表示在記憶體中可以定址,可以給它賦值(常量const型別也可以定址,但是不能賦值),rvalue中的r代表read,就是可以知道它的值。例如:

int a=3;

a在記憶體中有位址,而3沒有,但是可以read到它的值。

3=4;

這個是錯誤的,因為3的記憶體中沒有位址,不能當作左值。

下面這個語句不容易出錯

a++=3;

這個語句編譯通不過的,原因在於a++是先使用a的值,再給a加1。實現如下:

[cpp]view plain

copy

print

?

++a是右值。

++a=3;

這個是正確的,++a的實現如下:

[cpp]view plain

copy

print

?

顯然++a的效率高。

左值的宣告符號為&,右值的宣告符號為&&。在c++中,臨時物件不能作為左值,但是可以作為常量引用const &

[cpp]view plain

copy

print

?

#include

void print_lvalue(int& i)//左值

void print_rvalue(int&& i)//右值

int main()  

#includevoid print_lvalue(int& i)//左值

void print_rvalue(int&& i)//右值

int main()

有時候我們希望把左值當作右值來使用,例如乙個變數的值,不再使用了,希望把它的值轉移出去,c++11中的std::move就為我們提供了將左值引用轉為右值引用的方法。

[cpp]view plain

copy

print

?

#include

void print_value(int& i)//左值

void print_value(int&& i)//右值

int main()  

#includevoid print_value(int& i)//左值

void print_value(int&& i)//右值

int main()

最長用的交換函式

[cpp]view plain

copy

print

?

void swap(t& a, t& b)  

void swap(t& a, t& b)

避免了3次拷貝。

move的本質,只是將引數轉換為右值引用,並沒有移動什麼。因此要實現類關於右值得建構函式和複製操作符。move實現如下:

[cpp]view plain

copy

print

?

template

decltype (auto) move(t&& param)  

template decltype (auto) move(t&& param)

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 ...