On 23 November 2013 16:54, Parmenides <mobile.parmenides@xxxxxxxxx> wrote: > Hi, > > I have the following code: > > #include <iostream> > #include <cstring> > using namespace std; > > class Int{ > int x; > > public: > Int(int i = 0) > { > x = i; > } > > ~Int() > { > } > > void show() > { > cout << x << endl; > } > > friend Int operator+(Int &a, Int &b) // Because 'b' is a reference to > object rather than an object > { > return Int(a.x+b.x); > } > }; > > int main() > { > Int i(3), j; > j = i + Int(6); // This can not call constructor. This creates a temporary object and temporaries cannot bind to non-const references. > j.show(); > > return 0; > } > > Gcc issues error message, but VC++ 2010 compile it successfully. I This is a well-known VC++ bug, it allows temporaries to bind to non-const references. That does not conform to the C++ standard. > tried to modify > > friend Int operator+(Int &a, Int &b) > > to > > friend Int operator+(Int a, Int b) > > both compiler can get it pass. Why Gcc does not want to convert a > 'int' to a 'Int' object in the '+' operator function when its second > parameter is a reference to object rather than an objetc? Because a temporary cannot bind to a non-const reference. > I further modified > > j = i + Int(6); > > to > > j = i + 6; > > both compiler can get it pass again. Therefore, I think it seem that > Gcc encourage programmers to use implict conversion like 'i + 6' > rather that explict conversion like 'i + Int(6)'. Is this right? No, GCC encourages you to use const references if you want to bind to temporaries, as required by the C++ standard. Your operator should have been declared friend Int operator+(const Int& a, const Int& b) > If > so, does this practice comfore to the C++ standard? G++ conforms to the standard in this regard.