令我惊讶的是,以下 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'
因为 lambda通过引用(而不是通过 value)f
捕获自动变量,并且在调用点不在上下文中(所以在body 中是一个悬空引用)。x
x
f()
x
f
为什么 lambda 通过引用捕获仍在使用悬空引用?