c++程式設計中如果出現把乙個函式的返回值、強行轉化後的物件 作為函式的引數傳進去時,編譯器會報錯的情況。這時候就該注意了,你需要把該函式的引數型別前加上const修飾。
原因在於c++的左值和右值有所區別:
c++中每乙個表示式都會產生乙個左值和右值。比如a=3。a就是乙個左值,3就是乙個右值。左值可以作為右值,但右值不能作為左值。比如:3=b;就不是正確的。
那麼怎麼分辨左值和右值呢?
一般來說,左值的位址對程式設計師是開放的,比如定義的變數或物件我們可以用 &加變數名或物件名 將它的位址取出來。
但是乙個右值 比如存放函式返回值的臨時變數、被強制型別轉換的物件(也會產生乙個臨時物件,注意是自定義型別不是基本型別,基本型別的右值不能被const或volatile修飾,也不能被修改),
我們不知道它具體叫什麼名字,所以它的位址對程式設計師是不開放的,那麼他就是乙個右值。
對於右值來說有這樣兩點需要注意:
1.(自定義型別的)右值可以使用他的成員函式改變自己的資料成員。
2.(自定義型別的)右值只能被const型別的引用所引用,所以說傳進右值的函式的形參要宣告為const的,不然編譯會出錯。
不過這種東西還真是不方便呢,不過如果不嫌麻煩,可以再建立乙個和臨時物件型別一致的物件把臨時物件接過來,使用新的左值就可以正常呼叫函式了,當然你把函式的形參型別宣告為const也是極好的。
C 左值和右值,左值引用和右值引用
c 對於左值和右值沒有標準定義,但是有乙個被廣泛認同的說法 可見立即數,函式返回的值等都是右值 而非匿名物件 包括變數 函式返回的引用,const物件等都是左值。從本質上理解,建立和銷毀由編譯器幕後控制,程式設計師只能確保在本行 有效的,就是右值 包括立即數 而使用者建立的,通過作用域規則可知其生存...
C 左值和右值
c 左值與右值概念 變數和文字常量都有儲存區,並且有相關的型別,區別在於變數是可定址的 1 資料值,儲存在某個記憶體位址中,也稱右值 rvalue 右值是被讀取的值 read value 文字常量和變數都可被用於右值。2 位址值,即儲存資料值的那塊記憶體位址,也稱左值 lvalue 文字常量不能被用...
C 左值和右值
左值 lvalue 和右值 rvalue 是 c c 中乙個比較晦澀基礎的概念,有的人可能甚至沒有聽過,但這個概念到了 c 11 後卻變得十分重要,它們是理解 move,forward 等新語義的基礎。左值與右值這兩概念是從 c 中傳承而來的,在 c 中,左值指的是既能夠出現在等號左邊也能出現在等號...