为什么以下关闭不起作用?

时间:2014-11-04 01:02:09

标签: c++ c++11

请考虑以下代码。

#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?

1 个答案:

答案 0 :(得分:0)

事实证明,在咨询我实验室中的其他学生之后,如果您想通过引用捕获闭包中的变量,则必须确保在您尝试访问时该变量仍在范围内它。特别是,这意味着您可以将闭包传递给函数调用来自函数getFunction(),但不能将其返回到另一个函数。上面的闭包有一个与通过指针返回局部变量相同的问题。

相反,可以使用值捕获闭包,尽管这意味着捕获的变量是只读的。

std::function<void()> getFunction() {
    int foo = 0;
    return [=] () { // Capture by value works
        printf("foo = %d\n", foo);
    };
}