2015-12-30 423 views
2

我是C++新手。我試圖學習const的概念。有人能告訴我爲什麼第一個聲明是非法的,而第二個聲明是合法的?爲什麼int&r = 0是非法的,而const int&r = 0是合法的?

int i = -1, &r = 0;   

const int i = -1, &r = 0; 
+3

[可能爲[對常量引用的文字初始化]重複(http://stackoverflow.com/questions/) 2088259/literal-initialization-for-const-references) – Zeta

+1

@Zeta:建議dup表示*「C++不允許:'int&ref = 7;'因爲這是不合邏輯的,「* - 對於OP來說,這裏的問題 - *」爲什麼第一個非法,而第二個合法「*是顯而易見的,另一個問題是關於'const'引用,而不是與非'const'的對比。 –

回答

8

i是一個紅色的鯡魚在這裏,問題是int &r = 0;const int &r = 0;

一個非const左值引用必須直接綁定到左值。 0不是左值,所以int &r = 0;失敗。

常量左值引用可能會綁定到右值。發生這種情況時,不會直接綁定。相反,創建一個臨時(const int這裏的類型)並從右值複製初始化。由於這種綁定,臨時性的生命期延長了。

所以const int &r = 0;是合法的,有const int __temp = 0; const int &r = __temp;

+4

注意:我使用雙下劃線來表示這是僞代碼 –

4

int i = -1, &r = 0;是一樣的:

int i = -1; 
int &r = 0; 

這裏的問題是,你可以不寫int &r = 0;,因爲參考的初始化需要的初始化是一個左值(一個對象,其地址 可以採取),而文字0不是。

但是const引用的初始值不需要是左值,所以const int &r = 0;沒問題。

1

int i = -1, &r = 0;類似的效果基本等同於寫

int i = -1; 
int &r = 0 

第二條語句試圖非const左值綁定到0,這是不是一個完全左值(0不是可以取地址的對象)。然而,它是一個const左值,因爲它被綁定(不是直接通過)到右值。

2

i = -1,位創建i變量初始化爲-1,反而使得該來後,沒有引用任何區別,所以讓我們關注:

int &r = 0;  // illegal 
const int &r = 0; 

const int&版本做什麼是延長值的生命週期它必然是:換句話說,0值保持在r以上,直到r定義的範圍結束。

很容易指出的是,同樣的慷慨大方,沒有延伸到int&版「因爲它不是一個左值」。爲什麼在C++ FAQ討論的更有趣的問題:

在C++中,非const引用可以綁定到左值和const引用可以綁定到左值或右值,但可以結合什麼到非常量值。這是爲了防止人們在使用新價值之前改變臨時銷售價值。例如:

void incr(int& a) { ++a; } 
int i = 0; 
incr(i); // i becomes 1 
incr(0); // error: 0 is not an lvalue 

如果增量(0)被允許或者一些臨時性的,沒有人見過將遞增或 - 差遠了 - 0值將成爲1後者聽起來很愚蠢,但實際上在早期的Fortran編譯器中存在一個像預留內存位置以保持值0那樣的錯誤。

+1

由於C++ 11,我們有'int&&r = 0;'這是合法的,並且因爲您提到 –

+1

@ M.M。 「int &&」函數參數的一個主要區別是它們是明確輸入的,並且引入了'std :: move',以確保調用代碼明確地確認它在哪裏可能是令人驚訝和有問題的,而'int&'暗示某種方式的輸出和有臨時約束的臨時性更可能是偶然發生的。 –

相關問題