2016-12-04 73 views
0

這是我的代碼。這運行,但它給我一個錯誤,當我從ostream &運營商< <刪除常量。爲什麼?爲什麼運算符<<需要const?

作爲一個側面問題,顯示的錯誤消息是:不能將'std :: ostream {aka std :: basic_ostream}'左值綁定到'std :: basic_ostream & &'。這是如何表明我錯過了一個const?

#include <iostream> 

using namespace std; 

class pair_int{ 
public: 
    int x; 
    int y; 
    pair_int(int x, int y):x(x),y(y){}; 
    friend ostream& operator<< (ostream & s, pair_int & c); 
}; 
ostream& operator<<(ostream & s, const pair_int & c){ 
    s << c.x; 
    s << ","; 
    s << c.y; 
    return s; 
} 
pair_int square(int x){ 
    return pair_int(x, x*x); 

} 
int main(int argc,char * argv []){ 
    int x; 
    cin >> x; 
    cout << square(x); 

    return 0; 
} 
+0

1.4.3的對象不應該改變的對象的內容,因此,對象正在輸出是恆定的或'const'。 –

+1

否則您無法通過臨時實例嗎? –

+0

請參閱http://stackoverflow.com/questions/1565600/how-come-a-non-const-reference-cannot-bind-to-a-temporary-object – juanchopanza

回答

2

因爲調用square()的結果是一個r值,其可以結合到一個const 1-值引用或r值參考,但不是一個可變1-值參考。

這是設計用來防止您意外創建臨時設備,然後您可以進行變異並丟棄而沒有意義。

(不適用於違規Microsoft編譯)

+0

它適用於其他規則破解編譯器嗎? :) :) –

+0

@RSahu我不知道有任何其他公司試圖通過拒絕遵守國際貪婪標準來阻止創新,但是如果你把它們引起我的注意,我會高興地將它們召喚出來。 –

+0

不幸的是,我不知道有任何其他公司。我每天都在使用MS編譯器。疼痛打擊了我的家。 –

相關問題