[英]Why is it allowed to pass R-Values by const reference but not by normal reference?
下面的程序
void display(const int& a)
{
cout << a ;
}
如果使用這樣的文字調用將起作用
display(5);
但沒有const
它就行不通。
那么const
引用如何保持指向 R 值(匿名變量)呢?
對於你的最后一個問題:
const 引用如何保持指向 R 值(匿名變量)
這是答案。 C++ 語言說局部常量引用會延長臨時值的生命周期,直到包含范圍結束,但可以節省復制構造的成本(即,如果您要使用局部變量)。
認為任何對象作為含一些值內和盒可以或可以不具有名稱標簽,即具有名稱標記為盒框的variable
和沒有姓名標簽作為框literal
。 無論是否有名牌,我們都有盒子。
Reference
是我們將名稱標簽添加到我們的盒子的方式。
int a = 5;
int &b = a;
我們的盒子有兩個名稱標簽(里面的值為5
)。
const int &c = 5;
你在那里,這個盒子剛剛命名。
以前從未有過名稱的框的新名稱必須標記為const
。 因為框內的值可以通過其名稱進行更改,我們不希望它發生(不允許發生)到我們的literal
框。
它回到文字的定義。 文字是常數; 例如,數字 5 的值永遠不會改變,盡管變量可能會從被分配的值 5 更改為另一個值。 通過引用傳遞文字意味着該函數可能會修改它,根據定義,這是您無法對文字執行的操作,這就是語言要求您使用 const 修改它的原因。 我不認為 C++ 可以修改文字,即使它讓您嘗試,但它仍然強制執行此約定以提醒程序員不能修改文字值。
因為文字是常數。 1 不能變成 2, "abd"
不能變成"edf"
。
如果 C++ 允許您通過非const
引用獲取文字,那么它將:
(1) 會在你的程序中造成混亂,因為x == 1
可能意味着“x 等於 2”取決於上下文,並且 (2) 是不可能實現的,因為void display(int& a)
應該如何知道它是否收到字面引用?
由於這兩個選項都沒有意義,因此只能通過const
引用傳遞文字。
實際上,不推薦使用的從字符串文字到char*
轉換是一個很好的例子,說明了為什么規則很有意義,盡管它不是引用而是指針。 您可以讓char*
指向"abc"
,但嘗試實際利用char*
的“可修改性”屬性並修改char
元素之一會導致未定義的行為。 這使得整個棄用的轉換既危險又無用(在非遺留代碼中)。
你不想在語言的所有其他部分都遇到這樣的麻煩,是嗎?
r 值是一個臨時的消逝對象,可以讀取但即將被銷毀。 它也是一個不能留在賦值左側的值(你怎么能理解為這樣的幽靈賦值?)
C++ 有一種非常特殊的方式來處理這種實體。 如果您可以通過(非常量)引用傳遞 r 值,您也可以從函數內部分配給它。 因此,如果 r 值通過引用傳遞,則必須是常量引用。
但這並不是全部事實,因為您確實有 r 值引用(用&&
表示)。 因此,您最終可以操作臨時對象,但是您必須使用 r 值引用明確聲明您確實想要這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.