今、
if(++iter != end && *iter == value) {/* ... */}
のようなコードを書いていてふと心配になった。短絡評価は保証されていただろうか? そしてそもそも評価順序は保証されていただろうか? 短絡評価が保証されていなければ、上のコードはSEGVしかねないし、評価順序が保証されていなければ、意図通り動くことが保証されない。
C++17以前は多くの式の評価順序が未規定だ。
std::cout << f() << g() << h(); // ???
詳細は以下を。
https://cpprefjp.github.io/lang/cpp17/expression_evaluation_order.html
論理AND, ORの評価順序と短絡評価は保証されている
n3337(C++11直後)の§5.14, §5.15には、以下のような記述がある。非常に短いため、この部分だけならサラッと読めるので信用ならんという人は自分であたってみて欲しい。C++のドラフトはGitHubで公開されている。
N3337
5.14 論理AND演算子
...
&
とは異なり、&&
は左から右に評価されることが保証されている。最初のオペランドがfalse
だった場合、2つめのオペランドは評価されない。
...
5.15 論理OR演算子
...
|
とは異なり、||
は左から右に評価されることが保証されている。さらに、最初のオペランドがtrue
だった場合、2つめのオペランドは評価されない。
n4659では§8.14と§8.15になっている。
というわけで、論理and/orの評価順、そして短絡評価までが規格で保証されていることがわかった。安心してその振る舞いに依存することが出来る。