ちょっと前までの規格では単一式(≒セミコロンとセミコロンの間)の中の評価順は基本的にコンパイラが好き勝手に弄る事が許されてた
例えばa[++b]=cとかはヒトの常識的にはbをインクリメントしてからa[b+1]にcを代入するけど、別にa[b+1]にcを代入してからbを増やしたって構わない(この前のどっかでa[b+1]を参照してればその方が最適化したら効率的かもしれない)
そんな感じで最適化に都合がいいように評価順には寛容すぎるほど寛容だったんだが、カオスを防ぐためのルールがあって、それが「単一式で同じオブジェクトを2回変更したら未定義」というもの
例えば(a+=1)+=1はどっちの1を先にaに足してもいいが、そういう自由度がある時点で未定義というルールになっていた
もっと分かりやすい例だと(a+=2)*=3は最初のaが1なら常識的には9になると思うけど、評価順ルール的には3を先に掛けてから2を足して5にしたっていい
9か5の二択で済むこれはマシな方で、ポインタが絡むと収拾がつかなくなるから、同じもん2回以上書き換えたらもう知らん未定義じゃってのがCとちょい前までのc++の規格の趣旨だった
で、この話をさっきのiostreamに持ち込むと、operator <<はconstメンバー関数じゃないので、cout << foo << barはcout << fooと、(cout<<fooの戻り値==coutの参照) << barの2回のcoutへの変更を順序は不確定な単一式でやってることになる。つまりさっきのaと同じように未定義動作って事
(cout <<fooを先に実行しないと戻り値確定しないからこっちが先に決まってるのでは?と思うだろうけど、規格の文言上はcout <<fooの戻り値を「予測」して<<barの適用を先にやったって構わないのである。そんな病的なコンパイラがたまたま実在しなかったから今まで問題にならなかったんだろうけどね)
という話がrangesのパイプでoperator|のチェーンの検討をしてるときに発覚してみんな真っ青になって慌てて評価順のルールが見直されたっていう、まあアホ臭い話でした
幸い病的な最適化コンパイラが生まれる前だったから規格文言だけの話で実害はない
C++相談室 part161
レス数が950を超えています。1000を超えると書き込みができなくなります。
950デフォルトの名無しさん
2022/10/24(月) 01:33:32.70ID:1OFaOw+Nレス数が950を超えています。1000を超えると書き込みができなくなります。
ニュース
- 「排外主義が日本全体で跋扈」村井嘉浩宮城県知事−外国ルーツの女子児童へのいじめで [蚤の市★]
- 【テレビ】20代で7割、30代で6割が「見ていない」 衝撃の調査結果から考える「若者のテレビ離れ」本当の理由 [冬月記者★]
- クールジャパン機構、累積損失500億円超 政府が廃止など検討へ ★2 [ぐれ★]
- (株)秀和グループ(東京)が破産=秀和システム 船井電機(株)を傘下だが、脱毛サロン「ミュゼプラチナム」の連帯保証などして [お断り★]
- 【アニメ】『日本の最強アニソンBEST100』 1位はまたもや『残酷な天使のテーゼ』… 視聴者は「出来レース」「見飽きた」の声 [冬月記者★]
- AKB48契約解除の花田藍衣、動画で悲痛な訴え「運営から性的な質問をされ…峯岸さんのように坊主にして誠意を見せろと言われ坊主に」★5 [冬月記者★]
- 【地上波/DAZNほか】 FIFAワールドカップ2026 総合スレ★163【メキシコ/カナダ/アメリカ】
- 【地上波/DAZNほか】 FIFAワールドカップ2026 総合スレ★162【メキシコ/カナダ/アメリカ】
- 【MLB】ツインズ vs ドジャース ★3
- ハム専 ★5
- ハム専 ★4
- 〓たかせん〓
- 【緊急高市速報】水道資材卸売業者が中東情勢のせいで破綻する [469534301]
- 【文春】高市、暴かれた本性。木下秘書「文春は中国から毎週一千万円もらっている」自民党内から総スカンなど🤓 [359965264]
- 【朗報】GTA6、676GB [268244553]
- 【画像】メンヘラ系JK「え、むり。もう自殺する」👉電車の方が破壊されて生き延びる [398059782]
- 日本人が中国を未だに下に見る理由とは?高市も不思議がってる [472617201]
- 【疑問】ルパン三世テレビスペシャルがやらなくなった理由wwwwwwwwwwwwwwwwww [832215575]