#include <iostream>
using namespace std;
struct X
{
int i_Val;
X(int iVal)
:i_Val(iVal)
{
}
X& operator++()
{
cout << "X::operator++()" << endl;
++i_Val;
return *this;
}
operator int() const
{
return i_Val;
}
};
const X operator+(const X& lhs, const X& rhs)
{
cout << "operator+(const X&, const X&)" << endl;
return lhs.i_Val + rhs.i_Val;
}
int main()
{
X x = 5;
X y = (++x) + (++x) + (++x);
cout << y << endl;
}
编译并运行。它产生输出:
X::operator++()
X::operator++()
X::operator++()
operator+(const X&, const X&)
operator+(const X&, const X&)
24
但我期待这个:
X::operator++()
X::operator++()
operator+(const X&, const X&)
X::operator++()
operator+(const X&, const X&)
22
谁应该受到指责?我还是编译器?
答案 0 :(得分:4)
这是不未定义的行为或是一些i++ = ++i
苦难的骗局,因为重载的运算符是函数调用,并引入了隐式序列点。
但是,我的理解是,此上下文中的评估顺序未指定,编译器可以随意重新排序,但它喜欢。
答案 1 :(得分:0)
DeadMG给出了正确答案。
如果你想获得22,你可以尝试不同的编译器。 ;)
icc 为我提供所需的输出,而 gcc 会产生24。
答案 2 :(得分:0)
产生的输出在数学上更具声音。从左到右完成所有括号中的所有操作,然后执行父操作。