我们来看看这条线如何
cout << obj << ' ' << ++obj << endl;
已翻译。
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);
这就是整条线。
在这样的表达式中,不能保证operator<<(cout, obj)
将在之前执行++obj
。看来在你的平台上,++obj
之前执行过operator<<(cout, obj)
被执行。这解释了这种行为。
请注意,标准已更改。如果您能够使用 C++17,您将获得预期的行为。