2010-05-31 17 views
2

我遇到了纏繞這個問題的問題。我有一個函數有關獲取對cin的引用的初級問題

void foo(istream& input) { 
    input = cin; 
} 

這失敗(我假設,因爲CIN是不應該是「可複製」。

然而,這個工程

void foo(istream& input) { 
    istream& baz = cin; 
} 

是否有一個原因,我可以得到一個參考巴茲與CIN,但我不能把它分配給輸入?

感謝

+1

是因爲 input = cin; 與做相似(如果輸入istream *) * input = cin; – 2010-05-31 16:34:59

回答

2

這句法:

void foo(istream& input) { 
    input = cin; 
} 

不會創建一個參考。它調用operator=這是爲了複製事物。然而
此語法:

void foo(istream& input) { 
    istream& baz = cin; 
} 

定義了一個新的參考變量。

關鍵的一點是,在C++中,一旦聲明它就不能更改引用。
聲明後,引用的行爲就好像它是引用自身的對象一樣。因此在其上使用operator=試圖複製到它。

1

這是完全合理的。

克隆東西併爲其創建別名是不同的操作。

0

& (reference)實際上作爲名稱別名工作,所以您所做的所有更改實際上都是在您要引用的對象上完成的。

因此,第一塊代碼失敗,因爲您直接使用別名流,該別名流中有一個不可訪問(私有)operator=

你的第二塊代碼實際上意味着你正在創建別名,因此它是有效的。

0

參考必須被初始化,但不能被分配給。不幸的是,初始化和賦值(可以)都使用=,所以哪個是哪個並不總是顯而易見的。在這種情況下,這種差異至關重要。

當你做istream& baz = cin;時,你正在初始化引用,但對istream本身沒有任何作用。當你做input = cin;時,它的初始化是而不是,因爲那時input已經被初始化了。這隻剩下另一種可能性:分配。但是,由於您不能分配給引用本身,因此它被解釋爲試圖將cin分配給input引用的流。由於不能分配流,編譯器會拒絕。