2017-07-18 4 views
1

fooがインスタンスであるクラスFooを考えてください。このリレーショナルは式とよく似ていないのですか?

Fooは、watermark()が「ゲッター」である内部メンバーを変更し、その内部メンバーと同じタイプのものを返す関数calculate()を持っています。

は、明確に定義された式

foo.calculate() != foo.watermark() 

です。つまり、が呼び出される前にcalculate()が起きる必要がありますか?

言い換えれば、評価の順序は厳密にはfoo.calculate()であり、次にfoo.watermark()とそれに続いて!=

+3

両方の間にシーケンシャルポイントはありません。評価の順番は不明です。 – Jarod42

+0

[未定義の動作とシーケンスポイント](https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points)の重複したコピー –

答えて

4

両方の間に逐次ポイントはありません。評価の順序は不明です。

あなたが例えばとしてシーケンスを強制する必要があります。

const auto& res = foo.calculate(); 
res != foo.watermark(); 
0

それは助けることがあります。関数呼び出し式の関数の引数の評価順序や部分式の評価の順序内など、ほぼすべてのC++の演算子(のオペランドの評価のhttp://en.cppreference.com/w/cpp/language/eval_order

注文を任意の式)は指定されていません。コンパイラは、任意の順序でオペランドを評価することができ、同じ式が再度評価されるときに別の順序を選択することができます。

3

C++標準(ISO/IEC 14882:2014)の言う前に、シーケンス・

は、非対称、推移、ペアであります単一のスレッドによって実行される評価の間には、 の関係があり、これらの評価の間で部分的な順序が になります。任意の2つの評価Aおよび Bが与えられた場合、AがBの前に配列されている場合、Aの実行はBの実行の前に行わなければならない。AがBより前に配列されず、BがAの前に配列された でない場合、順序付けられていない。評価Aおよび Bは、AがBより前に配列決定されるか、 BがAより前に配列決定されるが、いずれの配列が特定されていない場合、不確定に配列決定される。

シーケンスされていない、または不確定にシーケンスされた操作の両方で、同じスカラーオブジェクトが副作用または値の計算に現れることを許可しないでください。

参照リンクhere

関連する問題