2016-12-04 2 views
0

Voici mon code. Cela fonctionne, mais il me donne une erreur lorsque je supprime le const de ostream & opérateur < <. Pourquoi?Pourquoi l'opérateur << a-t-il besoin de const?

Comme une question de côté, le message d'erreur affiché est: ne peut pas lier 'std :: ostream {alias std :: basic_ostream}' lvalue à 'std :: basic_ostream & &. Comment cela indique-t-il que je manque un 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

un objet doit Restitution modifier le contenu des objets, ainsi l'objet étant sortie est constante ou 'const'. –

+1

Vous ne pourriez pas passer des instances temporaires autrement? –

+0

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

Répondre

2

parce que le résultat de l'appel square() est une valeur r, qui peut se lier à une référence const l-valeur ou une valeur de référence r, mais pas une référence l-valeur mutable. Ceci est voulu par la conception, pour vous éviter de créer accidentellement des temporaires que vous muteriez et jetteriez sans le vouloir.

(ne s'applique pas à la règle révolutionnaire compilateurs Microsoft)

+0

Est-ce que cela s'applique à d'autres compilateurs de rupture de règles? :) :) –

+0

@RSahu Je ne connais pas d'autres entreprises qui essaient de freiner l'innovation en refusant de se conformer aux normes internationales de la cupidité, mais si vous les portez à mon attention, je les appellerai volontiers. –

+0

Malheureusement, je ne connais pas d'autres sociétés. Je travaille quotidiennement avec des compilateurs MS. La douleur frappe à la maison pour moi. –