私はこの記事を読みました:未定義の動作とシーケンスポイントですが、それが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
この動作についての情報を教えてください。