2013-10-15 75 views
7

我正在閱讀有關C++中的引用。它說int& a = 5給編譯時錯誤。爲什麼在C++中不允許int&a = <value>?

在C++ 思考 - 布魯斯埃克爾,作者說編譯器必須首先分配存儲用於INT併產生地址綁定到參考。存儲必須const因爲改變它會沒有意義

我對此感到困惑。我無法理解它背後的邏輯。爲什麼不能更改存儲中的內容?我知道它按照C++規則是無效的,但爲什麼?

+0

的可能重複[爲什麼非const引用不能綁定到一個臨時對象?(HTTP://計算器。 com/questions/1565600/how-come-a-non-const-reference-can-bind-to-a-temporary-object) – legends2k

回答

6

「存儲必須是常量,因爲改變它是沒有意義的。」

如果你想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; 
5
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臨時。

+1

對於'f()'示例+1:** THIS **。我偶爾想知道爲什麼l-refs不能自己綁定臨時對象,但從來沒有想過那個。感謝您拓寬我的視野:-) – Angew

+0

感謝您的回覆。所以我從你的回答中得出結論,_Bjarne Stroustrup就是這樣做的。我只是想確保我不會錯過這個概念背後的邏輯! –

0

你可以做的是

int b=5; 
int &a=b; 

const int& a = 5; 
相關問題