and演算子の短絡評価にはまった話

以下のコードで論理演算でなぜか右の関数funcが呼び出されてない><

    return a && func();

ってことになやまされ、とりあえず問題を分解するために

    auto f = func();
    return a && f;

としたら正常に動いた。
なんで?って思ってTwitterでつぶやいたら一瞬で反応がかえってきた。
どうやら短絡評価というらしい。
これはつまり評価の際「false && func()」の時点で答えはfuncの返す値にかかわらずfalseになってしまうのでここで評価をやめてfuncは永久に呼び出されないというもの。funcが重い処理だったりするときに便利だけどfuncがboolを返す以外の副作用をもってたりすると今回みたいに意図した結果を返さずハマる...評価させたいものはバラすか、あるいは左にもってくるかしないとダメということですね。

もう忘れない。踏みぬいたバグの数だけ強くなれるよね(と信じたい