
項目 31:ディフォルトのキャプチャモードは避ける
|
227
さらに、divisor を明示的にキャプチャしようとしても(値キャプチャ、参照キャプチャのいず
れでも)、コンパイルできません。divisor がローカル変数でも仮引数でもないためです。
void Widget::addFilter() const
{
filters.emplace_back(
[divisor](int value) // error! no local
{ return value % divisor == 0; } // divisor to capture
);
エラー! キャプチャするロー
カルな divisor がない
}
ディフォルトの値キャプチャ節を用いると divisor をキャプチャできず、用いなければコンパイ
ルできないなんて、一体どうしたことでしょう?
鍵は raw ポインタ this の暗黙の使用にあります。すべての非 static メンバ関数は this ポ
インタを持っており、クラスのメンバ変数を使用する際には毎回このポインタを使用しているの
です。例えば、Widget のどのメンバ関数でも、divisor を使用すると、内部ではコンパイラが
this->divisor に置き換えています。
void Widget::addFilter() const
{
filters.emplace_back(
[=](int value) { return value % divisor == 0; }
);
}
上記ディフォル ...