C++ C++;每个函数中的函子意外行为

C++ C++;每个函数中的函子意外行为,c++,stl,functor,C++,Stl,Functor,考虑以下示例: #include <iostream> #include <vector> #include <algorithm> using namespace std; class accum { public: int sum; accum() { sum = 0; } void operator() (int a) { sum += a; printf(

考虑以下示例:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class accum
{
public:
    int sum;
    accum()
    {
        sum = 0;
    }
    void operator() (int a)
    {
        sum += a;
        printf("sum=%d\n",sum);
    }
};

int main()
{
     int ari[] = {2,8,5,9,1};
     vector<int> vi(&ari[0], &ari[5]);
     accum f;
     for_each(vi.begin(), vi.end(), f);
     printf("final sum : %d\n", f.sum);
}
#包括
#包括
#包括
使用名称空间std;
类累积
{
公众:
整数和;
accum()
{
总和=0;
}
void运算符()(int a)
{
总和+=a;
printf(“总和=%d\n”,总和);
}
};
int main()
{
int ari[]={2,8,5,9,1};
向量vi(&ari[0],&ari[5]);
累计f;
对于每个(vi.开始(),vi.结束(),f);
printf(“最终金额:%d\n”,f.sum);
}
我希望总数是
25
,但它打印的是
0
。为什么
f
保持不变?有人能给我一个详细的情况吗?

那是因为它的函子是按值计算的,而不是按引用计算的。它在
f
的副本上进行内部操作,您传入的副本保持不变。它确实会将函子返回给您,因此您可以直接覆盖您的函子:

accum f = std::for_each(vi.begin(), vi.end(), accum());
或者,使用C++03,让
accum
获取参考:

struct accum {
    int& sum;
    // rest as before, fixing the constructor
};

int sum = 0;
std::for_each(vi.begin(), vi.end(), accum(sum));
printf("final sum : %d\n", sum);
尽管您可能只想:

或者,在C++11中,
对于每个带有lambda的

int sum = 0;
std::for_each(vi.begin(), vi.end(), [&](int a){ sum += a; });

非常感谢。非常有用。
int sum = 0;
std::for_each(vi.begin(), vi.end(), [&](int a){ sum += a; });