Lambda表达式闭包功能不起作用

时间:2017-04-12 05:50:56

标签: c++ lambda

我想通过编译器确认lambda表达式和转换后的闭包,并尝试编写以下内容:

{{1}}

但上面的lambda闭包不起作用。如果我删除了默认构造函数,那么编译器会给出错误,如果我有这个,那么结果仍为0。

出了什么问题?

谢谢,

2 个答案:

答案 0 :(得分:1)

您正在创建一个临时Sum对象,将其传递给for_each并将其丢弃。同时,不修改称为sum的无关int变量。另外,std :: for_each采用的UnaryFunction是按值计算的,所以它修改的Sum对象无论如何都是临时的。

lambda将闭包变量捕获为成员,如果它们被指定为引用,则它们引用外部作用域中可见的内容,而不管lambda本身是否为副本。你可以模仿lambda这样做:

//this example demonstrate lambda function in c++

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct Sum
{
    int mySum;
    Sum(){}
    Sum(int s):mySum(s){}

    void operator()(int x){
        mySum += x;
    }
};

// Incorporates a reference to a UnaryFunction so it can be passed by
// reference.
template <class A, class T>
struct LambdaWrapper {
    LambdaWrapper(T &t) :t(t) { }
    void operator () (A a) { return t(a); }
    T &t;
};

int main(int argc, char const *argv[])
{
    vector<int> v { 3, 4, 2, 1, 56, 2, 4, 65, 2, 9, 8, 5, 7 };

     auto sum = Sum(0);
     //for_each(begin(v), end(v), [&mySum = sum](int x){ mySum += x;});
     //for_each(begin(v), end(v), LambdaWrapper<int,Sum>(sum)); // <-- this would be fine
     for_each(begin(v), end(v), [&sum](int x) { sum(x) }); // <-- also fine
     cout << sum.mySum << endl;
    return 0;
}

答案 1 :(得分:1)

更清洁的是:

vector<int> v { 3, 4, 2, 1, 56, 2, 4, 65, 2, 9, 8, 5, 7 };
auto sum = for_each(begin(v), end(v), Sum()).mySum;
cout << sum << endl;

基于op的评论:

  

通过仿函数获得相同功能需要进行哪些更改   由lambda表达式提供?

lambda的等效代码是:

struct Sum
{
    int *mySum;
    Sum(){}
    Sum(int *s):mySum(s){}

    void operator()(int x){
        *mySum += x;
    }
};

int main(int argc, char const *argv[])
{
    vector<int> v { 3, 4, 2, 1, 56, 2, 4, 65, 2, 9, 8, 5, 7 };

     auto sum = 0;
     for_each(begin(v), end(v), Sum(&sum));
     cout << sum << endl;
    return 0;
}