2012-05-29 57 views
9

我碰到一個代碼片斷來const引用可以分配一個int?

const int& reference_to_const_int = 20; 
cout<<"\n reference_to_const_int = "<<reference_to_const_int<<endl;  

此代碼編譯&與輸出執行: -

reference_to_const_int = 20 

這東西對我來說陌生。據我所知,參考不佔用內存&他們是其他變量的別名。因此,我們不能說

int& reference_to_int = 30; 

上述聲明不得編譯給錯誤: -

error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’ 

究竟是在「const int的&」的情況下發生的是什麼?完整的解釋是需要的。

請幫助。

感謝

+2

閱讀:http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ –

+0

給它多一點想法,它似乎它*會*是合法的。如果不是這樣,你不可能在沒有更多變量的情況下設置它。 –

+0

@GigaWatt:你在說什麼「它」?相信我,如果「它」*應該*是合法的,它*會*。 :) –

回答

11

臨時被創建,並且是合法的一個const參考綁定到它,但非法將其綁定到一個非const之一。

它就像:

const int& reference_to_const_int = int(20); //LEGAL 
     int& reference_to_const_int = int(20); //ILLEGAL 

一個const參考延伸的臨時的生活,這就是爲什麼這個工程。這只是語言的一個規則。

+0

不會在賦值語句之後超出範圍,因此print語句引用已超出範圍的「int」? –

+3

@FlorianSowade不,const引用延長了臨時的生命。 –

+4

但請注意,在所有情況下,const引用不會延長生命週期。還要注意,Microsoft C++編譯器違反了規則,並允許將非''constst'引用綁定到臨時對象。 –

5

此行爲是容易當我們看時,我們綁定到一個臨時對象的引用會發生什麼瞭解。如果我們寫

const int& reference_to_const_int = 20; //A temporay object int(20) is created. 

編譯器轉換上面的代碼弄成這個樣子:

int temp = 20; 
const int& reference_to_const_int = temp; 

如果reference_to_const_int沒有const的,那麼我們就可以分配一個新值reference_to_const_int。這樣做不會改變文字20,而是改變臨時對象,因此臨時對象不可訪問。 只允許將const引用綁定到需要臨時值的值,完全避免了此問題,因爲const引用是隻讀的。

爲什麼C++允許常量引用接受臨時對象或右值(如文字)?

我們看到引用最常見的地方是作爲函數的參數或者返回值。 當引用被用作函數參數時,對函數內部引用的任何修改都會導致函數外部參數的更改。

如果功能可以預期/接受臨時對象或文字作爲輸入,並且如果所述對象的功能方面常量性,使得參數const引用將允許在所有情況下要使用的功能。

臨時對象始終是常量,所以如果你不使用const引用,這樣的說法將不被編譯器所接受。

void f(int&) {} 
void g(const int&) {} 
int main() 
{ 
    //f(1); //Error 
    g(1); //OK 
} 
相關問題