Hi all,
I've recently had some issues with the streaming operator and the
order of precedence used when mixing it with the member function
operator (operator .) Example code is below.
#include <iostream>
#include <vector>
using namespace std;
class A
{
public:
A() : i(0) {};
int f() {
i++;
v.push_back(i);
return i;
}
void reset() { i = 0; v.clear(); }
int i;
vector<int> v;
};
int main()
{
A a;
// Order of action:
// - Member functions fire from RIGHT to LEFT.
// - Insertion operators fire from LEFT to RIGHT
cout << a.f() << a.f();
cout << endl;
cout << "Vector contents a: ";
for (unsigned int i = 0; i < a.v.size(); ++i )
{
cout << a.v.at(i);
}
cout << endl;
a.reset();
int k;
// Order of action;
// - Member functions fire from LEFT to RIGHT
// - Addition operator fires.
// - Assignment operator fires.
k = a.f() + 3*a.f();
cout << "k: " << k << endl;
cout << "Vector contents a: ";
for (unsigned int i = 0; i < a.v.size(); ++i )
{
cout << a.v.at(i);
}
return 0;
}
*********************************************************************************
OUTPUT:
21
Vector contents a: 12
k: 7
Vector contents a: 12
*********************************************************************************
The result of this seems to indicate that the . operator for the
member function call has different associativities in the different
situations. I must be missing something here, but I haven't been able
to find anyone to give me a conclusive answer on it. Can anyone here
shed some light on it?
Cheers,
Daniel.