Hi Wakely, Thanks for your reply. The code has gotten compiled successfully with both compliers. I wonder what is the difference between 'Int &' and 'const Int &'. Why the former fails, while the latter causes the conversion from an 'int' to an 'Int' object? 2013/11/26 Jonathan Wakely <jwakely.gcc@xxxxxxxxx>: > Please reply to the mailing list, not me. > > On Nov 25, 2013 1:23 PM, "Parmenides" <mobile.parmenides@xxxxxxxxx> wrote: >> >> Hi Wakely, >> >> Thanks for your reply. The code has gotten compiled successfully with >> both compliers. I wonder what is the difference between 'Int &' and >> 'const Int &'. Why the former fails, while the latter causes the >> conversion from an 'int' to an 'Int' object? >> >> >> 2013/11/24 Jonathan Wakely <jwakely.gcc@xxxxxxxxx>: >> > 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.