Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

+= operator overloading and cascading?

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.

like image 265
user3020233 Avatar asked Feb 04 '14 17:02

user3020233


2 Answers

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.

like image 164
Nawaz Avatar answered Oct 03 '22 07:10

Nawaz


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.

like image 42
TemplateRex Avatar answered Oct 03 '22 07:10

TemplateRex