For educative purposes, I wish to overload and use the += operator in cascade.
class a {
public:
a();
a& operator+= (float f);
private:
float aa;
}
a() {
aa = 0;
}
a& operator+= (float f) {
aa += f;
return *this;
}
a b;
b += 1.0; // Works.
b += 1.0 += 1.0; // Error : Expression must be a modifiable lvalue.
I don't understand why the above doesn't work (aside of the possible syntax mistakes -- didn't try to compile this sample code). Returning *this in the overloaded operator+= method, I would expect the second += 1.0 to be called on the b object, no?
Thanks.
b += 1.0 += 1.0;
The associativity for +=
is right-to-left. So the above is interpreted as:
(b += (1.0 += 1.0));
Does that make sense? NO.
In order to make it work, you need to write it as:
(b += 1.0) += 1.0;
Hope that helps.
Please note that in order to have a class a
with the least amount of surprise for its users, it's probably best to also define a member function
a& operator+=(a const&);
as well as non-member functions
a operator+(a const&, a const&);
a operator+(a const&, float);
a operator+(float, a const&);
that are each defined in terms of one of the member operator+=
overloads. Then you can write
a1 += b1 + c1;
where a1
is of type a
the variables b1
, c1
can both be either float
or a
. See this question from the c++-faq for more details.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With