我遇到了纏繞這個問題的問題。我有一個函數有關獲取對cin的引用的初級問題
void foo(istream& input) {
input = cin;
}
這失敗(我假設,因爲CIN是不應該是「可複製」。
然而,這個工程
void foo(istream& input) {
istream& baz = cin;
}
是否有一個原因,我可以得到一個參考巴茲與CIN,但我不能把它分配給輸入?
感謝
我遇到了纏繞這個問題的問題。我有一個函數有關獲取對cin的引用的初級問題
void foo(istream& input) {
input = cin;
}
這失敗(我假設,因爲CIN是不應該是「可複製」。
然而,這個工程
void foo(istream& input) {
istream& baz = cin;
}
是否有一個原因,我可以得到一個參考巴茲與CIN,但我不能把它分配給輸入?
感謝
這句法:
void foo(istream& input) {
input = cin;
}
不會創建一個參考。它調用operator=
這是爲了複製事物。然而
此語法:
void foo(istream& input) {
istream& baz = cin;
}
定義了一個新的參考變量。
關鍵的一點是,在C++中,一旦聲明它就不能更改引用。
聲明後,引用的行爲就好像它是引用自身的對象一樣。因此在其上使用operator=
試圖複製到它。
這是完全合理的。
克隆東西併爲其創建別名是不同的操作。
& (reference)
實際上作爲名稱別名工作,所以您所做的所有更改實際上都是在您要引用的對象上完成的。
因此,第一塊代碼失敗,因爲您直接使用別名流,該別名流中有一個不可訪問(私有)operator=
。
你的第二塊代碼實際上意味着你正在創建別名,因此它是有效的。
參考必須被初始化,但不能被分配給。不幸的是,初始化和賦值(可以)都使用=
,所以哪個是哪個並不總是顯而易見的。在這種情況下,這種差異至關重要。
當你做istream& baz = cin;
時,你正在初始化引用,但對istream
本身沒有任何作用。當你做input = cin;
時,它的初始化是而不是,因爲那時input
已經被初始化了。這隻剩下另一種可能性:分配。但是,由於您不能分配給引用本身,因此它被解釋爲試圖將cin
分配給input
引用的流。由於不能分配流,編譯器會拒絕。
是因爲 input = cin; 與做相似(如果輸入istream *) * input = cin; – 2010-05-31 16:34:59