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

2021-09-28 16:22:05 字數 1523 閱讀 3682

當引用的初始式是乙個左值(是乙個物件,你可以取得它的位址),其初始化就是非常簡單的事情。對"普通"t&的初始式必須是乙個型別t的左值

對乙個const t&的初始式不必是乙個左值,甚至可以不是型別t;在這種情況下:

1 首先,如果需要將應用到t的隱式型別轉換

2 而後將結果存入乙個型別t的臨時變數

3 最後,將此臨時變數用做初始式的值

考慮double& dr = 1; //錯誤:要求左值

const double& cdr = 1; //ok

對後乙個初始化的解釋是

double temp = double(1); //首先建立乙個具有正確值的臨時變數

const double& cdr = temp; //而後用這個臨時變數作為cdr的初始式

這種儲存引用初始式的臨時變數將一直存在,直到這個引用的作用域結束

以上來自《the c++ programming language》

我們自己也可以看個例子:

int a = 2;

double& b = a;//錯誤 ,要求是double型別的

error:invalid initialization of non-const reference of type 『double&』 from an rvalue of type 『double』

從書中和自己測試的來看非常量引用初始化左值必須為乙個相同型別的左值,但是如果加上const就像書中所說不需要是左值或者說不需要是相同型別

***********************************=

對於書中說的左值做個詳細的介紹如下:

區分左值與右值:

c++ 11中引入的乙個非常重要的概念就是右值引用。理解右值引用是學習「移動語義」(move semantics)的基礎。而要理解右值引用,就必須先區分左值與右值。

對左值和右值的乙個最常見的誤解是:等號左邊的就是左值,等號右邊的就是右值。

左值和右值都是針對表示式而言的,左值是指表示式結束後依然存在的持久物件,右值是指表示式結束時就不再存在的臨時物件。乙個區分左值與右值的便捷方法是:看能不能對表示式取位址,如果能,則為左值,否則為右值。下面給出一些例子來進行說明。

int a = 10;

int b = 20;

int* pflag = &a;

vectorvcttemp;

vcttemp.push_back(1);

string str1 = "hello ";

string str2 = 「world」;

const int &m = 1;

請問,a,b, a+b, a++, ++a, pflag, *pflag, vcttemp[0], 100, string(「hello」), str1, str1+str2, m分別是左值還是右值?

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

今天碰到了這個問題,回顧一下概念 左值與右值 根據c primer第五版,當乙個物件被用作右值的時候,用的是物件的值,當物件被用作左值的時候,用的是物件的身份 下面這個函式就是正確的 includeint function int a int main 而這個就是錯誤的 includeint fun...

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