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