为什么 lambda 表达式中的表达式相同,但输出却不同?
Why is the output different even though the expressions are the same in lambda expression?
我对这样的 lambda 表达式有疑问:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int sum(vector<int>& v){
int total = 0;
auto lambda = for_each(v.begin(), v.end(), [&total](int n){total += n;});
lambda; // lambda expression doesn't work.
for_each(v.begin(), v.end(), [&total](int n){total += n;}); // work same as I intended.
return total;
}
int main(void){
vector<int> v = {1, 2, 3, 4, 5};
cout << sum(v) << endl; // 30 (I think this should be 45.)
}
我认为 lambda;
可以像 for_each
算法一样做同样的事情。为什么 lambda;
不起作用?
根据 cppreference,for_each(...)
调用 returns 传递给函数的 UnaryFunction
。
在这种情况下,for_each
returns UnaryFunction
[&total](int n){total += n;}
a lambda(5)
会使 total
值增加 5。
一个解决方案是将 for_each
调用放在一个单独的函数中 - 这实际上是一个“求和”函数。
这已经由 std:accumulate
函数
完成
std::accumulate(v.begin(), v.end(), 0);
如果不考虑本声明累加变量total的副作用
auto lambda = for_each(v.begin(), v.end(), [&total](int n){total += n;});
实际上相当于
auto lambda = [&total](int n){total += n;};
所以这个声明
lambda; // lambda expression doesn't work.
没有意义。
所以 lambda 表达式的声明只是多余的。
事实上,您在此声明中两次调用算法 std::for_each
auto lambda = for_each(v.begin(), v.end(), [&total](int n){total += n;});
并在此声明中
for_each(v.begin(), v.end(), [&total](int n){total += n;});
我对这样的 lambda 表达式有疑问:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int sum(vector<int>& v){
int total = 0;
auto lambda = for_each(v.begin(), v.end(), [&total](int n){total += n;});
lambda; // lambda expression doesn't work.
for_each(v.begin(), v.end(), [&total](int n){total += n;}); // work same as I intended.
return total;
}
int main(void){
vector<int> v = {1, 2, 3, 4, 5};
cout << sum(v) << endl; // 30 (I think this should be 45.)
}
我认为 lambda;
可以像 for_each
算法一样做同样的事情。为什么 lambda;
不起作用?
根据 cppreference,for_each(...)
调用 returns 传递给函数的 UnaryFunction
。
在这种情况下,for_each
returns UnaryFunction
[&total](int n){total += n;}
a lambda(5)
会使 total
值增加 5。
一个解决方案是将 for_each
调用放在一个单独的函数中 - 这实际上是一个“求和”函数。
这已经由 std:accumulate
函数
std::accumulate(v.begin(), v.end(), 0);
如果不考虑本声明累加变量total的副作用
auto lambda = for_each(v.begin(), v.end(), [&total](int n){total += n;});
实际上相当于
auto lambda = [&total](int n){total += n;};
所以这个声明
lambda; // lambda expression doesn't work.
没有意义。
所以 lambda 表达式的声明只是多余的。
事实上,您在此声明中两次调用算法 std::for_each
auto lambda = for_each(v.begin(), v.end(), [&total](int n){total += n;});
并在此声明中
for_each(v.begin(), v.end(), [&total](int n){total += n;});