我读过这篇文章:未定义的行为和序列点,但我不知道它是否是 UB。
考虑以下示例:
#include <iostream>
class op {
public:
explicit op(int x) {
std::cout << "x: " << x << std::endl;
}
op & operator + (const op & /* other */) {
return *this;
}
};
int main(int /* argc */, char * /* argv */ []) {
int x = 0;
op o = op(x++) + op(x++) + op(x++);
std::cout << "res: " << x << std::endl;
return 0;
}
我期望这样的输出(或基于评估顺序的一些输出排列):
x: 0
x: 1
x: 2
res: 3
gcc-4.7.1 和 clang-3.0 给了我这样的输出,但是当我用 msvc-2010 编译这个例子时,我得到了输出:
x: 0
x: 0
x: 0
res: 3
你能给我一些关于这种行为的信息吗?