非常量引用的初始值必須為左值

2022-02-03 01:48:00 字數 1977 閱讀 6967

今天碰到了這個問題,回顧一下概念:

左值與右值

根據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也跟著變化。那麼這是為什麼呢?下面我們來講乙個概念 左值和右值?左值和右值都...