I\'m learning C++ and I have this problem:
#include
using namespace std;
class test
{
public:
Let's examine how the line
cout << obj << ' ' << ++obj << endl;
is translated.
Step 1.
cout << obj
becomes
// A non-member function.
operator<<(cout, obj)
Step 2.
operator<<(cout, obj) << ' '
becomes
// Also a non-member function.
operator<<(operator<<(cout, obj), ' ')
Step 3.
operator<<(operator<<(cout, obj), ' ') << ++obj
becomes
// Also a non-member function.
operator<<(operator<<(operator<<(cout, obj), ' '), ++obj)
Step 4.
operator<<(operator<<(operator<<(cout, obj), ' '), ++obj) << endl;
becomes
// A member function.
operator<<(operator<<(operator<<(cout, obj), ' '), ++obj).operator<<(endl);
That's the entire line.
In such an expression there is no guarantee that operator<<(cout, obj)
will be executed before ++obj
. It appears that in your platform, ++obj
is executed before operator<<(cout, obj)
is executed. That explains the behavior.
Please note that the standard has changed. If you are able to use C++17, you will get the expected behavior.