14

C++0x に関する限り i = ++i 未定義ではないという説明に非常に納得していますが、 の動作がi += ++i明確に定義されているかどうかを判断することはできません。テイカーはいますか?

4

1 に答える 1

9

明確に定義された推論は、それi = ++iも明確に定義されなければならないことを証明するためにも同様に使用できますi += ++i

i += ++iと同等でi += (i += 1)あり、新しい順序付け規則では、i += 1部分式の値計算の前に代入が行われる必要があります。
これは、式の結果がi += ++ifor と同じでなければならないことを意味しi = 2 * i + 1ます。

編集:結局のところ、動作は未定義であるため、回答を修正する必要があります。サブ式(左側の引数) との値計算は相互に順序付けされておらず、そのうちの 1 つに object の更新が含まれているため、
の動作は未定義です。i += ++ii++ii

これは式 の問題ではありませi = ++ii。左側の は左辺値から右辺値への変換を受けないためです。これはこのi += ++i場合に発生します。


余談ですが、真面目なプロジェクトではそのようなコードを書かないでください。順序付けルールを正確に知ることに依存しすぎており、順序付けルールを正しく理解していないか、DR 637 の結果であるルールの変更に気付いていないか、いくつかの重要なルールを見逃してつまずく人が多くなるでしょう。問題の表現の側面(この回答の最初の改訂を作成したときに私に起こったように)。

于 2010-10-14T13:54:26.203 に答える