【问题标题】:c++11 lambda high-order function wrapper recursive errorc++11 lambda高阶函数包装递归错误
【发布时间】:2015-10-07 03:31:43
【问题描述】:
#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);
}

上面的代码会打印出来

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写同样的代码

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);
})();

它会打印出来

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 编译器。一切都以这个错误告终。

【问题讨论】:

    标签: c++ c++11 lambda functional-programming


    【解决方案1】:

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

    【讨论】:

    • @ShafikYaghmour 真的很抱歉,但这段代码伤害了我的大脑:(
    • 但是如何才能完成这项工作。我将 function wrapper(function f) 更改为 function wrapper(function& f)。但是编译器说错误:从'std::function'类型的右值对'std::function&'类型的非常量引用的无效初始化
    • 我自己想通了。将 auto ff = [&](int a) 更改为 auto ff = [=](int a) 。
    猜你喜欢
    • 2011-01-05
    • 2014-01-22
    • 2018-04-07
    • 1970-01-01
    • 2014-08-16
    • 2020-04-04
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多