为什么 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; 不起作用?

根据 cppreferencefor_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;});