今天碰到了這個問題,回顧一下概念:
左值與右值
根據c++primer第五版,當乙個物件被用作右值的時候,用的是物件的值,當物件被用作左值的時候,用的是物件的身份;
下面這個函式就是正確的
#includeint function(int a)
int main()
而這個就是錯誤的
#includeint function(int &a)
int main()
報錯如下:
無法將引數1從int轉換為「int &」,非常量引用的初始值必須為左值
這裡的左值,可以理解為在記憶體中有具體的位址的變數,而不是乙個短暫的臨時變數。
這個左右,可以理解為,在賦值號「=」 的左邊,為左值,在等號右邊,為右值,但這個左右並不是絕對的。
在第乙個例子裡,function(int a)的引數為實參,如果傳入乙個1,函式會建立乙個有位址的區域性變數a,對a進行賦值,讓 a= 1,這裡的a是乙個左值,所以程式能正確執行,但在第二個例子裡,function(int &a)的引數為乙個位址,function會根據這個位址去取對應的值,但是我們傳入的引數是數字1,這個1顯然不是左值,因為它不是變數,沒有位址,function根據位址找不到對應的變數,自然會報錯。
如果單純想知道報錯是為什麼原因,那麼看到這裡就ok了,如果想繼續了解左值、左值引用與右值引用可以接著往下看
ok,在了解了左值和右值的概念後,下面來做一組判斷,下面**一共有五個等號,分別判斷等號兩邊的是左值還是右值:
int a = 10;
int c = a;
std::string s1 = "hello";
std::string s2 = "world";
std::string s3 = s1 + s2;
從等號的左邊到右邊的答案依次是:
int a = 10; // a左值,10右值
int c = a; // c左值,a左值
std::string s1 = "hello"; // s1左值,"hello"右值
std::string s2 = "world"; // s2左值,"world"右值
std::string s3 = s1 + s2; // s3左值,s1 + s2右值
值得注意的是第二行和第五行,int c = a,由於兩邊都是變數,都有其儲存空間,所以都是左值
但是第五行裡,s1和s2都是左值,都有其儲存空間,但是s1 + s2就不是左值了,因為相加得到的結果是乙個臨時變數,會被賦給s3。
左值引用與右值引用
左值引用,顧名思義就是對左值變數的引用,右值引用同理
int &a = 10; // 報錯,因為無法建立乙個左值的引用指向乙個右值
int& getvalue(int& n)
int& getvalue(int& n)
注意,通過關鍵字const,我們可以實現如下的功能:
const int &a = 10; //正確
這一行**實際上相當於,這也就是const特殊的地方:
int temp = 10;
const int &a = temp;
所以說,如果對於之前的例子,我們可以通過const關鍵字讓程式正常執行:
#includeint function(const int &a)
int main()
非常量引用初始化必須為左值
當引用的初始式是乙個左值 是乙個物件,你可以取得它的位址 其初始化就是非常簡單的事情。對 普通 t 的初始式必須是乙個型別t的左值。對乙個const t 的初始式不必是乙個左值,甚至可以不是型別t 在這種情況下 1 首先,如果需要將應用到t的隱式型別轉換 2 而後將結果存入乙個型別t的臨時變數 3 ...
error 非常量引用只能繫結到左值
今天遇到乙個關於c 引用的錯誤,說實話以前確實一直沒注意到過引用還有這個規則 1 已啟動生成 專案 opengl,配置 debug win32 1 game.cpp 1 d 18482 visual studio source repos opengl opengl game.cpp 55 erro...
C C 引用必須為左值的問題詳解
我們常常會遇到這樣的問題 const int a 101 對 int b 101 錯 例子 int a int b a a 10 printf b d n b 此時b 10,b是a的引用,就是說b和a的位址相同,對a做改變b也跟著變化。那麼這是為什麼呢?下面我們來講乙個概念 左值和右值?左值和右值都...