2016-12-04 36 views
0

ここに私のコードです。これは実行されますが、ostream &オペレータ< <からconstを削除するとエラーが表示されます。どうして?operator <<に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

オブジェクトを出力するオブジェクトの内容を変更するべきではなく、従って出力されるオブジェクトが一定または 'const'あります。 –

+1

そうでないと一時インスタンスを渡すことができませんでしたか? –

+0

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

答えて

2

square()を呼び出した結果は、可変L値基準CONST L値基準またはR値の参照に結合することができるR値、である、ではないからです。

これは誤って一時的なものが作成され、その後に変更して意味のない状態で投げるのを防ぐためのものです。

(ルール破壊するために、Microsoftのコンパイラを適用しない)

+0

他のルール破りコンパイラにも適用されますか? :) :) –

+0

@RSahu私は国際的な欲望の基準に従うことを拒否してイノベーションを阻止しようとしている他の企業は知らないのですが、あなたがそれらを私の注意を引くならば、私は喜んでそれらを呼び出すでしょう。 –

+0

残念ながら、私は他の企業を知らない。私は毎日MSコンパイラを使用しています。痛みは私のために家に当たります。 –

関連する問題