Re: overloading of ","
josh wrote:
On 12 Mar, 11:17, "josh" <xdevel2...@yahoo.com> wrote:
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);
// ------------------
cout << ox.i << endl;
return 0;
}
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...
Precedence and arity do match. I have no idea, what you mean by
associativity. Anyhow, what an overloaded comma operator lacks is the
sequence point that the built-in comma operator gives you.
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
This is false: the evaluation order is unspecified. This is unrelated to
overloading. It is unspecified for built-in types, as well. See clause
[5/4].
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?
Your code has undefined behavior since it modifies the same object several
times without sequence points. The overloaded comma operator does not give
you the sequence point that forces left-to right evaluation.
Best
Kai-Uwe Bux