请考虑以下代码。
#include <functional>
#include <stdio.h>
#include <stdlib.h>
std::function<void()> getFunction() {
int foo = 0;
return [&] () {
printf("foo = %d\n", foo);
};
}
int main(){
std::function<void()> foo = getFunction();
foo();
}
在我的机器上,它会打印以下内容。
foo = 32767
为什么不打印0?
答案 0 :(得分:0)
事实证明,在咨询我实验室中的其他学生之后,如果您想通过引用捕获闭包中的变量,则必须确保在您尝试访问时该变量仍在范围内它。特别是,这意味着您可以将闭包传递给函数调用来自函数getFunction()
,但不能将其返回到另一个函数。上面的闭包有一个与通过指针返回局部变量相同的问题。
相反,可以使用值捕获闭包,尽管这意味着捕获的变量是只读的。
std::function<void()> getFunction() {
int foo = 0;
return [=] () { // Capture by value works
printf("foo = %d\n", foo);
};
}