如果用成語來形容左右值,左值就是曠日持久,右值則是曇花一現。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 的返回值是右值,在其被賦值給某一變數前,我們不能通過變數名...