2016-03-19 55 views
3

正如標題所說,爲什麼允許它通過一定的基準,但不正常的引用傳遞的R值(文字)爲什麼它可以通過const引用傳遞R值而不是正常引用?

void display(const int& a) 
{ 
cout << a ; 
} 

會工作,如果叫display(5)但沒有const它不會工作**** **我的意思是const引用如何保持指向一個R值(匿名變量)******

+0

如果你改變'a',你會發生什麼? –

+0

什麼?請解釋我不是那種有天賦的 –

+0

如果你不使用'const',那麼你就是說你可能會改變'a'引用的內容,但是如果它引用一個字面值,那該如何工作呢? –

回答

4

爲了您的最後一個問題:

const引用如何能保持指向一個R值(匿名變量)

Here is the answer。 C++語言表示,本地const引用延長了臨時值的生存期,直到包含範圍結束爲止,但爲您節省了複製構造的成本(即,如果您要使用本地變量)。

+0

可以標記更多而不是一個答案,因爲其中的一些答案確實做得很好,謝謝 –

+1

只需選擇最好,最完整的答案;不一定是這個。 – Tanz87

+0

我已閱讀您的[鏈接](http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/)。這是非常豐富的。謝謝。 – NERDYLIZARD

2

它返回到文字的定義。文字是一個常數;例如,數字5的值永遠不會改變,儘管變量可能會從被指定爲5的值改變爲另一個值。通過引用傳遞一個字面意味着該函數可能會修改它,這是你無法對一個文字進行的定義,這就是爲什麼該語言要求你用const修改它。我不認爲C++可以修改文字,即使它允許你嘗試,但它仍然強制這個慣例提醒程序員文字值不能被修改。

希望能回答你的問題!

+0

實際上是什麼我',問一個常量引用如何保持指向一個具有表達式範圍的匿名變量,並且謝謝 –

+0

所以你想知道爲什麼參考不會失去它所指的內容,因爲文字的生命期應該到期之後的表達? – Durendal

+0

這就是我在徘徊 –

1

因爲文字是恆定的。 1不能成爲2,"abd"不能成爲"edf"

如果C++允許你通過非const參考採取文字,那麼它要麼:

  1. 必須讓文字動態地改變自己的意思,讓你做1成爲2.
  2. 期待程序員要特別小心,只能通過那些不涉及文字的引用來修改值,並且如果你弄錯了,就調用未定義的行爲。

(1)將在程序中製造混亂,因爲x == 1可能意味着「爲x等於2」根據上下文,和(2)是不可能實現的,因爲void display(int& a)應該如何知道它是否接收一個字面引用或不?

由於這兩個選項都不合理,文字只能通過const引用傳遞。


其實,從字符串文字到char*棄用的轉換也是爲什麼規則做出很大的意義,雖然它不是一個參考,但指向一個很好的例子。您可以讓char*指向​​,但嘗試實際使用char*的「可修改性」屬性並修改其中一個元素會導致未定義的行爲。這使得整個棄用的轉換既危險又無用(在非遺留代碼中)。

你不想在語言的其他部分遇到這樣的麻煩,對嗎?

+0

其實我什麼,問的是如何可以一個恆定的引用保持指向一個具有表達範圍的匿名變量,並感謝的 –

3

內部含有一些值的任何對象作爲和盒可以或可以不具有名稱標記即,盒子名稱標籤作爲variable和盒而不名稱標籤作爲literal的思考。無論名牌是否存在,我們擁有箱子。


Reference是我們的名稱標籤添加到我們的信箱的方式。

int a = 5; 
int &b = a; 

我們有名稱標籤我們的盒(帶值5內)。

const int &c = 5; 

你在那裏,箱子剛剛命名。


從來沒有名稱的盒子的新名稱必須標記爲const。因爲箱子內的數值可以通過它的名稱改變,我們不希望它發生(不允許發生)與我們的literal箱子。

+0

驚人的解釋,謝謝從我心底 –

1

r值是一個臨時消逝物體,可以讀取但即將銷燬。它也是一個不能停留在賦值左側的值(你怎麼理解賦值給這樣的幽靈?)

C++有一個非常具體的方式來處理這種實體。如果你可以通過(非const)引用傳遞一個r值,你也可以從函數內部賦值給它。因此,如果要通過引用傳遞r值,這必須是一個const引用。

儘管這並不是全部的事實,因爲你確實有r值參考(用&&表示)。因此,最後,您可以操縱一個臨時對象,但是您必須使用r值引用來明確聲明您確實想要這樣做。

相關問題