驚いたことに、次の C++ プログラム:
#include <iostream>
#include <functional>
int main() {
std::function<void(void)> f;
{
int x = 1;
f = [&x]() { std::cout << x; };
}
//std::cout << x; // error: use of undeclared identifier 'x'
f(); // no error!
return 0;
}
出力:
1
コメント行のコメントを外したときに得られる出力と同じ出力が期待できます。
error: use of undeclared identifier 'x'
ラムダは参照によって(値ではなく)f
自動変数をキャプチャし、呼び出しの時点でコンテキストにないため(したがって、本体はダングリング参照です)。x
x
f()
x
f
参照によるラムダキャプチャがまだダングリング参照で機能しているのはなぜですか?