Краткий ответ: статические переменные, объявленные внутри лямбды, работают так же, как статические переменные функции во внешней области видимости, которые были автоматически захвачены (по ссылке).
В этом случае, даже если лямбда-объектвозвращается дважды, значения сохраняются:
auto make_sum()
{
static int sum = 0;
static int count = 0;
//Wrong, since these do not have static duration, they are implicitly captured
//return [&sum, &count](const int&i){
return [](const int&i){
sum += i;
++count;
cout << "sum: "<< sum << " count: " << count << endl;
};
}
int main(int argc, const char * argv[]) {
vector<int> v = {0,1,1,2,3,5,8,13};
for_each(v.begin(), v.end(), make_sum());
for_each(v.begin(), v.end(), make_sum());
return 0;
}
против:
auto make_sum()
{
return [](const int&i){
//Now they are inside the lambda
static int sum = 0;
static int count = 0;
sum += i;
++count;
cout << "sum: "<< sum << " count: " << count << endl;
};
}
int main(int argc, const char * argv[]) {
vector<int> v = {0,1,1,2,3,5,8,13};
for_each(v.begin(), v.end(), make_sum());
for_each(v.begin(), v.end(), make_sum());
return 0;
}
Оба дают одинаковый вывод:
sum: 0 count: 1
sum: 1 count: 2
sum: 2 count: 3
sum: 4 count: 4
sum: 7 count: 5
sum: 12 count: 6
sum: 20 count: 7
sum: 33 count: 8
sum: 33 count: 9
sum: 34 count: 10
sum: 35 count: 11
sum: 37 count: 12
sum: 40 count: 13
sum: 45 count: 14
sum: 53 count: 15
sum: 66 count: 16