2016-12-04 7 views
0

Hier ist mein Code. Dies läuft, aber es gibt mir einen Fehler, wenn ich die Const von Ostream & Operator < < entfernen. Warum?Warum benötigt der Operator << const?

Als Seite Frage, gezeigt ist die Fehlermeldung: kann nicht binden 'std :: ostream {aka std :: basic_ostream}' L-Wert auf 'std :: basic_ostream & &'. Wie zeigt dies, dass ich ein const vermisse?

#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

Ausgabe ein Objekt sollte nicht die Objekte Inhalt ändern, damit das Objekt ausgegeben konstant ist oder 'const'. –

+1

Sie konnten temporäre Instanzen andernfalls nicht übergeben? –

+0

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

Antwort

2

, weil das Ergebnis des Aufrufs square() ist ein r-Wert, der einen const l-Referenzwert oder eine R-Wert-Referenz binden kann, aber nicht eine änderbare Referenz L-Wertes.

Dies ist von Entwurf, um zu verhindern, dass Sie versehentlich Provisorien erstellen, die Sie dann mutieren und ohne Bedeutung wegwerfen.

(nicht ausschließen brech gilt Microsoft-Compiler)

+0

Gilt es für andere Regelunterbrechungscompiler? :) :) –

+0

@RSahu Ich bin mir keiner anderen Unternehmen bewusst, die versuchen, Innovation zurückzuhalten, indem sie sich weigern, den internationalen Gier-Standards zu entsprechen, aber wenn Sie mich darauf aufmerksam machen, werde ich sie glücklich herausrufen. –

+0

Leider sind mir keine anderen Firmen bekannt. Ich arbeite täglich mit MS-Compilern. Der Schmerz trifft mich heim. –