返回lambda捕获函数参数引用

时间:2016-08-22 09:38:38

标签: c++11 lambda

#include <iostream>
#include <functional>

using namespace std;

std::function<void(void)> makeLambda(int param)
{
    return [&param](){cout << param << endl;};
}

int main()
{
    auto callback = makeLambda(5);
    callback();
}

基于lambda description如下所示,它看起来程序将导致未定义的行为,因为在调用回调时,捕获的var,函数参数超出范围。但我发现它总能打印5。

我的g ++版本是gcc-4.9.1。

  

悬空参考

     

如果通过引用隐式或显式捕获实体,并且   在调用之后调用闭包对象的函数调用操作符   实体的生命周期已经结束,发生了未定义的行为。 C ++   闭包不会延长捕获的引用的生命周期。

     

同样适用于捕获的对象的生命周期   这个指针。

为什么会起作用?

1 个答案:

答案 0 :(得分:3)

如您所知,这是未定义的行为。任何事情都可能发生,包括出现在工作中。如果你改变编译器,改变标志,忘记做菜,或者一小时后起床,你可能会得到完全不同的结果。

作为示例,Clang prints 32767用于某些版本和标记集。