
230
|
6 章 ラムダ式
computeDivisor(calc1, calc2);
filters.emplace_back(
[=](int value) // captures nothing!
{ return value % divisor == 0; } // refers to above static
);
何もキャプチャしない! 上記の
スタティックを使用
++divisor; // modify divisor
} divisor を変更
上例を気軽に斜め読みしたとしても、[=] は目に入るでしょう。「あぁ分かった。このラムダは使
用するオブジェクトをすべてコピーするから自己完結しているんだね。」いいえ、自己完結していま
せん。このラムダは非スタティックローカル変数を一切使用していないため、何もキャプチャしませ
ん。ラムダのコードではスタティック変数の divisor を使用しているのです。addDivisorFilter
を実行するたびに、処理の最後で divisor をインクリメントするため、filters に追加したすべて
のラムダが異なる動作となります(divisor の値の変化に応じ)。実質的にこのラムダは divisor
を参照キャプチャしており、ディフォルトの値キャプチャ節が示す内容とはまったく矛盾していま
す。ディフォルトの値キャプチャ節を避けるようにしていれば、このような誤解が発生する危険性
を排除できます。
重要ポイント
•
ディフォルトの参照キャプチャでは不正参照が発生する恐れがある。 ...