我想通过编译器确认lambda表达式和转换后的闭包,并尝试编写以下内容:
{{1}}
但上面的lambda闭包不起作用。如果我删除了默认构造函数,那么编译器会给出错误,如果我有这个,那么结果仍为0。
出了什么问题?
谢谢,
答案 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;
}