3 回答

TA貢獻1786條經驗 獲得超13個贊
Stroustrup的“ C ++的設計和演進”中給出了C ++不允許您重新綁定引用的原因:
初始化后無法更改引用所指的內容。也就是說,一旦初始化了C ++引用,以后就不能再引用另一個對象了;它不能重新綁定。我過去曾被Algol68引用所困擾,在其中
r1=r2
可以通過分配給所引用r1
的對象,也可以根據的類型為r1
(重新綁定r1
)分配新的引用值r2
。我想避免在C ++中出現此類問題。

TA貢獻1856條經驗 獲得超11個贊
在C ++中,通常說“引用是對象”。從某種意義上說是正確的:盡管在編譯源代碼時將引用作為指針處理,但是引用旨在表示調用函數時未復制的對象。由于引用不能直接尋址(例如,引用沒有地址,并且返回對象的地址),因此在語義上重新分配它們是沒有意義的。而且,C ++已經具有指針,用于處理重新設置的語義。

TA貢獻1864條經驗 獲得超6個贊
因為那樣您就不會有不能為0的可重定位類型。除非您提供了3種引用/指針類型。哪一種只會使語言復雜化而得不到什么收益(然后為什么也不要添加第4種類型呢?非可重復引用可以為0?)
一個更好的問題可能是,為什么您希望引用可以重新定位?如果確實如此,那將使它們在許多情況下不那么有用。這將使編譯器更難進行別名分析。
似乎Java或C#中的引用可重新訪問的主要原因是因為它們完成了指針的工作。他們指向對象。它們不是對象的別名。
以下效果是什么?
int i = 42;
int& j = i;
j = 43;
在當今的C ++中,具有不可重復的引用,這很簡單。j是i的別名,并且i最終取值為43。
如果參考是可重新設置的,則第三行將參考j綁定到其他值。它不再是別名i,而是別名整數43(當然是無效的)。也許是一個更簡單(或至少在語法上有效)的示例:
int i = 42;
int k = 43;
int& j = i;
j = k;
具有可重新引用的參考。評估此代碼后,j將指向k。使用C ++的不可重復引用,j仍指向i,并且為i分配值43。
使引用可重新定位會更改語言的語義。該引用不再是另一個變量的別名。相反,它具有自己的賦值運算符,成為一種單獨的值類型。然后,引用的最常見用法之一將是不可能的。并沒有任何回報。新獲得的引用功能已經以指針的形式存在。因此,現在我們有兩種方法可以完成相同的工作,而沒有任何方法可以完成當前C ++語言中的引用。
- 3 回答
- 0 關注
- 642 瀏覽
添加回答
舉報