Это потому, что внутренне std :: for_each () создает копию функтора (так как можно передавать временный объект). Так что внутренне он делает сумму на копии, а не на объекте, который вы предоставили.
Хорошая новость заключается в том, что std :: for_each () возвращает копию функтора, чтобы вы могли получить к ней доступ оттуда.
Примечание: есть и другие стандартные алгоритмы, которые вы можете использовать. Как и std :: аккумулировать ().
Но предположим, что это просто упрощенный пример, и вам нужно for_each () для чего-то более хитрого, чем в примере. Есть несколько методов, позволяющих вам получить доступ к объекту-аккумулятору.
#include <iostream>
#include <algorithm>
#include <vector>
class Card{ public: int i;};
class Accumulator
{
public:
Accumulator(): counter(0){}
int counter;
void operator()(const Card & c) { counter += c.i; }
};
int main()
{
std::vector<Card> cards;
Accumulator a = std::for_each(cards.begin(), cards.end(), Accumulator());
std::cout << a.counter << std::endl;
}
В качестве альтернативы вы можете изменить Accumalator для увеличения ссылки, используемой в текущей области.
#include <iostream>
#include <algorithm>
#include <vector>
class Card{ public: int i;};
class Accumulator
{
int& counter;
public:
// Pass a reference to constructor.
// Copy construction will pass this correctly into the internal object used by for_each
Accumulator(int& counterRef): counter(counterRef){}
void operator()(const Card & c) { counter += c.i; }
};
int main()
{
std::vector<Card> cards;
int counter = 0; // Count stored here.
std::for_each(cards.begin(), cards.end(), Accumulator(counter));
std::cout << counter << std::endl;
}