首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++11 lambda高阶函数包装递归错误

c++11 lambda高阶函数包装递归错误
EN

Stack Overflow用户
提问于 2015-07-17 19:58:56
回答 1查看 136关注 0票数 3
代码语言:javascript
复制
#include <iostream>
#include <functional>
using namespace std;

function<int(int)> wrapper(function<void(int)> f)
{
    auto ff = [&](int a) {
        cout << "in wrapper " << a << endl;
        f(a);
        return 1;
    };
    return ff;
}

int main()
{
    auto fa = wrapper([](int a){
        cout << "in fa " << a << endl;
    });
    fa(999);
    wrapper([&fa](int b){
        cout << "in anon " << b << endl;
        fa(998);
    })(997);
}

上面的代码将打印出来

代码语言:javascript
复制
in wrapper 999
in fa 999
in wrapper 997
in anon 997
in wrapper 998                                                                                                                                                  
in anon 998                                                                                                                                                     
in wrapper 998                                                                                                                                                  
in anon 998                                                                                                                                                     
in wrapper 998                                                                                                                                                  
in anon 998                                                                                                                                                     
in wrapper 998                                                                                                                                                  
in anon 998                                                                                                                                                     
in wrapper 998                                                                                                                                                  
in anon 998                                                                                                                                                     
in wrapper 998                                                                                                                                                  
in anon 998                                                                                                                                                     
..........

直到分段故障。

我用javascript写了同样的代码。

代码语言:javascript
复制
function  wrapper(f)
{
    var ff = function(a) {
        console.log("in wrapper %s", a);
        f(a);
        return 1;
    };
    return ff;
}

(function ()
{
    var fa = wrapper(function(a){
        console.log("in fa %s", a);
    });
    fa(999);
    wrapper(function(b){
        console.log("in anon %s", b);
        fa(998);
    })(997);
})();

它将打印出来

代码语言:javascript
复制
in wrapper 999
in fa 999
in wrapper 997
in anon 997
in wrapper 998
in fa 998

c++ lambda代码是怎么回事?我尝试了g++-5.0和g++4.9编译器。所有的结果都是这个错误。

EN

回答 1

Stack Overflow用户

发布于 2015-07-17 20:10:22

ff通过引用捕获f,但f对于wrapper是本地的。当您返回ff时,该引用就会悬空,并且在调用ff时会触发未定义的行为。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31475352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档