簡體   English   中英

為什么允許通過常量引用而不是通過普通引用傳遞 R 值?

[英]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. 必須允許文字動態改變它們的含義,讓你可以讓 1 變成 2。
  2. 期望程序員特別注意僅通過那些不引用文字的引用來修改值,並在錯誤時調用未定義的行為。

(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM