Side Effects
副作用
式がある状態(変数など)を変更すると、副作用が生じる
雑に言うと、副作用は値を返す以外の何かである
Slide 14
Slide 14 text
What happened with C++11 and C++17?
C++11とC++17で何が変わった?
C++11:Squence point rules(C++03)の終わり, Sequence-before rules(C++11)の誕生
C++17: Sequence-before rulesの大幅な追加
※C++11でSequence point rules自体の刷新が行われていました
In other words
つまり
C++11以降では
ある式に式Aと式Bが含まれているとき
AとBの評価順が決まっているものと
そうでないものがある
一意に評価順が定まらない場合
AとBに同一のオブジェクトへの副作用が含まれていたら未定義動作になる
Unsequencedと呼ばれる状態
Slide 18
Slide 18 text
C++11:諸々の評価順序の規定
あらゆるオペレーターのオペランドの値の評価(ただし副作用を除く) はオペ
レーターの結果の評価より先に評価される(ただし副作用を除く)
A + B という式ではAとBが評価されてから結果が評価される
built-in assignmentがSequence-before rulesで順序規定された
A = B という式では式Bの評価(副作用を除く)が完了してから代入される
Built-in 前置++(--)の副作用はSequence-before rulesで順序規定された
++AがA = A + 1に置き換えられるという事実による暗黙のルール
上記2つの順序規定より自明
++Aの副作用は++Aの評価のあと完了する!
副作用の評価全然定まってねえ
式に副作用が2つあったとき、たいてい未定義の国へ直行
Slide 19
Slide 19 text
C++17:諸々の副作用の評価順序規定
In a subscript expression E1[E2], every value computation and side-effect of
E1 is sequenced before every value computation and side effect of E2
In a shift operator expression E1<>E2, every value computation
and side-effect of E1 is sequenced before every value computation and side
effect of E2
In every simple assignment expression E1=E2 and every compound assignment
expression E1@=E2, every value computation and side-effect of E2 is
sequenced before every value computation and side effect of E1
etc...
いい感じに副作用が完了するようになった!