左右值屬性和引用

2021-10-09 12:25:11 字數 1754 閱讀 5000

如果用成語來形容左右值,左值就是曠日持久,右值則是曇花一現。

1.1 左值和右值的區別

c++的表示式要麼是左值的,要麼是右值的 。左值和右值的區別在於:

1.2 運算子與左右值

一些運算子對操作的物件左右值有要求:

int a;a=3

;(a=4)

=5;

賦值表示式是函式,其要求左側物件是左值(非常量),右側要則要求為右值。本例中,變數a是非常量的左值,右值字面值常量3右值。返回值表示式屬性是左值(這就是為什麼賦值語句過載要返回引用)。(a=4)=5;說明了賦值結果是左值。

下面是針對非類型別的彙總:

運算子左側

右側結果

= 賦值llr

l& 取位址udl

r 下標lud

l* 解引用

udlr

lx++lud

r++xudl

l四則運算

lrlr

若左右均為l則為l;有一r則為r

關係運算

lrlr

r位運算

lrlr

r

void

fun(

void*)

;&1;

//not ok!1是字面值常量為右值

&a;//ok,a是普通變數

&fun;

//ok! fun是函式識別符號

&fun=3;

//not ok!返回的是右值,可這裡用作了左值

小結:左值和右值是表示式的屬性。絕大多數運算結果都是左值,取位址則為右值,常見右值有:字面值常量、返回右值的函式、返回右值的運算子(& 後置++ 後置-- ),常見的左值有:非常變數名,返回左值的函式,返回左值的運算子( 前置++ 前置-- +=)左值是持久的,右值的短暫的,建立即失效。

2.1 左值引用

左值引用是乙個與左值繫結的引用,不是所有的表示式都能繫結,以下情況不能被繫結:

int

&a =

4396

;//not ok!,字面值常量,右值!

double pi =

3.14

;int

&b = pi;

//not ok! 發生隱式轉換

int&ra =

&a;//not ok!取位址返回值為右值!

使用者使用左值引用可能會改變引用指向的物件,字面值是存在常量區的,一般不可更改。如果你將這個左值引用宣告為常量,那麼這個左值引用也可以引用常量。

const

int&ra=

123;

//ok!

2.2 右值引用

右值引用是左值,我們可以通過右值引用對其進行讀寫,因為右值是短暫的,所以它只能是:

右值是即將被銷毀的、且沒有其他使用者的物件。在右值引用之前,使用者無法對右值資源進行控制、接管。

int num =10;

//int && a = num; //右值引用不能初始化為左值

int&& a =10;

a =100

;cout << a << endl;

//輸出100

引用的這一擴充套件使得右值操作成為可能,這是c++實現特性移動語義和完美**的基礎。

左右值引用

1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...

左值引用和右值引用

在c 11中可以取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值 將亡值或純右值 舉個例子,int a b c,a 就是左值,其有變數名為a,通過 a可以獲取該變數的位址 表示式b c 函式int func 的返回值是右值,在其被賦值給某一變數前,我們不能通過變數名找到它,b c ...

左值引用和右值引用

1.左值和右值 在c 11中可以取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值 將亡值或純右值 舉個例子,int a b c,a 就是左值,其有變數名為a,通過 a可以獲取該變數的位址 表示式b c 函式int func 的返回值是右值,在其被賦值給某一變數前,我們不能通過變數名...