Re: overloading of ","
On 12 Mar, 13:16, Michael DOUBEZ <michael.dou...@free.fr> wrote:
josh a =E9crit :
Hi, I coded the following but It does not return what I expect, why?
#include <iostream>
using namespace std;
class Other
{
public:
int i;
Other(int x=1)
{
i = x;
}
Other *operator-> () { return this;}
Other &operator+ (Other t)
{
i += t.i;
return *this;
}
Other &operator,(Other oth)
{
i = oth.i;
return *this;
}
};
int main()
{
Other o0, o1, o2(4), o3(5);
o0->i = 100;
cout << o0.i << "\n" << o0->i << "\n";
// HERE it returns 5 AND not 6 WHY ???????????????????
Other ox = (o1 + o1, o3 = o2 + o1);
Because you have 5.
The expression evaluates:
Other ox = ( (o1 + o1) , (o3 = o2 + o1) );
Or with names
Other ox = o1.operator+(o1).operator,(o3.operator=(o2.operator+(o1)));
Since o3 is 5, then o1 is also 5 and ox is 5.
The reason is overloaded operator, doesn't have the same precedence as
POD operator,. Is is very confusing.
// ------------------
cout << ox.i << endl;
return 0;
}
Michael
the precedence, associativity and arity of overload operator, as rule,
"should" be the same for the PDO but here for the comma it doesn't
seem so...
if I add to my class an overload of * and than I make i.e.
o1 + o2 * 03 the evaluation order is correct and in fact will be FIRST
o2 * o3 and SECOND
o1 + (the mul result).
So I think that the compiler when meet that expression will do:
o1.operator+(o2.operator*(o3))
but it should do the same with:
(o1.operator+(o1)).operator,(o3 = 02.operator+(o1))
so it should evaluate from left to right as the same PDO rule...
so what's wrong?