我正在閱讀有關C++中的引用。它說int& a = 5
給編譯時錯誤。爲什麼在C++中不允許int&a = <value>?
在C++ 思考 - 布魯斯埃克爾,作者說編譯器必須首先分配存儲用於INT併產生地址綁定到參考。存儲必須是const因爲改變它會沒有意義。
我對此感到困惑。我無法理解它背後的邏輯。爲什麼不能更改存儲中的內容?我知道它按照C++規則是無效的,但爲什麼?
我正在閱讀有關C++中的引用。它說int& a = 5
給編譯時錯誤。爲什麼在C++中不允許int&a = <value>?
在C++ 思考 - 布魯斯埃克爾,作者說編譯器必須首先分配存儲用於INT併產生地址綁定到參考。存儲必須是const因爲改變它會沒有意義。
我對此感到困惑。我無法理解它背後的邏輯。爲什麼不能更改存儲中的內容?我知道它按照C++規則是無效的,但爲什麼?
「存儲必須是常量,因爲改變它是沒有意義的。」
如果你想a
是一個const值的引用,必須聲明爲const
,因爲a
被引用到一個臨時的恆定值,並且改變是不可能的。
const int &a = 123;
a = 1000; // `a` is referencing to temporary 123, it is not possible to change it
// We can not change 123 to 1000
// Infact, we can change a variable which its value is 123 to 1000
// Here `a` is not a normal variable, it's a reference to a const
// Generally, `int &a` can not bind to a temporary object
對於非const綁定:
int x = 1;
int &a = x;
a
是一個左值的引用。簡單來說,它是另一個變量的別名,所以在右邊你應該給一個變量。參考a
在第一次綁定後不能更改並綁定到另一個變量;
在C++ 11,則可以通過rvalue引用參考的臨時對象/值:
int &&a = 123;
int& a = 5;
爲了使上述代碼工作,int&
需要綁定到的臨時對象類型int
創建出的表達式5
。但結合int&
到temporay沒有吸引力了Bjarne Stroustrup的—,他舉了一個例子,類似如下,以闡明自己的觀點:
void f(int &i) { ++i; }
float x = 10.0;
f(x);
std::cout << x <<< std::endl;
會有什麼樣std::cout
打印?看起來它會打印11
。
它感覺,++i
正在改變參數x
,但它沒有。這就是爲什麼C++的創建者不允許臨時綁定到非const引用的原因之一。
但是,你可以這樣做:
int const & i = 10;
int const & j = x; //x is float
而且,由於C++ 11,你可以這樣做:
int && i = 10;
int && i = x; //x is float
希望有所幫助。
1.假設int&
可以結合創造出的x
臨時。
對於'f()'示例+1:** THIS **。我偶爾想知道爲什麼l-refs不能自己綁定臨時對象,但從來沒有想過那個。感謝您拓寬我的視野:-) – Angew
感謝您的回覆。所以我從你的回答中得出結論,_Bjarne Stroustrup就是這樣做的。我只是想確保我不會錯過這個概念背後的邏輯! –
你可以做的是
int b=5;
int &a=b;
或
const int& a = 5;
的可能重複[爲什麼非const引用不能綁定到一個臨時對象?(HTTP://計算器。 com/questions/1565600/how-come-a-non-const-reference-can-bind-to-a-temporary-object) – legends2k