Хорошо, как объяснил там Изменяемая спецификация позволяет изменять копии внешних переменных, и исходные переменные (не копии) не будут изменены.
Итак, я попробовал следующее:
const int elementCount = 4;
std::vector<int> v(elementCount, 1);
int x = 1;
int y = 1;
cout << "x 1 = " << x << endl;
cout << "y 1 = " << y << endl;
std::generate_n(v.begin() + 2, elementCount - 2, [=]() mutable throw() -> int {
// Generate current value.
int n = x + y;
cout << "x 2 = " << x << endl;
cout << "y 2 = " << y << endl;
// Update previous two values.
x = y;
y = n;
cout << "x 3 = " << x << endl;
cout << "y 3 = " << y << endl;
return n;
});
cout << "x 4 = " << x << endl;
cout << "y 4 = " << y << endl;
Журнал:
x 1 = 1
y 1 = 1
x 2 = 1
y 2 = 1
x 3 = 1
y 3 = 2
x 2 = 1
y 2 = 2
x 3 = 2
y 3 = 3
x 4 = 1
y 4 = 1
и мне было интересно, что значения скопированных переменных сохраняются от вызова к вызову. И я предположил, что некоторые переменные экземпляра для лямбда-объекта были созданы. И эти переменные экземпляра были изменены, и поэтому значения скопированных переменных сохраняются от вызова к вызову.
И чтобы проверить мое предположение, я сделал следующее:
const int elementCount = 4;
std::vector<int> v(elementCount, 1);
int x = 1;
int y = 1;
cout << "x 1 = " << x << endl;
cout << "y 1 = " << y << endl;
// Assign each element in the vector to the sum of the
// previous two elements.
auto lambda_gen = [=]() mutable throw() -> int {
// Generate current value.
int n = x + y;
cout << "x 2 = " << x << endl;
cout << "y 2 = " << y << endl;
// Update previous two values.
x = y;
y = n;
cout << "x 3 = " << x << endl;
cout << "y 3 = " << y << endl;
return n;
};
std::generate_n(v.begin() + 2, elementCount - 2, lambda_gen);
cout << "second calls group" << endl;
std::generate_n(v.begin() + 2, elementCount - 2, lambda_gen);
cout << "x 4 = " << x << endl;
cout << "y 4 = " << y << endl;
Итак, есть только один экземпляр lambda_gen, и я подумал, что значения копий х и у
может быть сохранен от первого вызова std :: generate_n ко второму.
Но вывод:
x 1 = 1
y 1 = 1
x 2 = 1
y 2 = 1
x 3 = 1
y 3 = 2
x 2 = 1
y 2 = 2
x 3 = 2
y 3 = 3
second calls group
x 2 = 1
y 2 = 1
x 3 = 1
y 3 = 2
x 2 = 1
y 2 = 2
x 3 = 2
y 3 = 3
x 4 = 1
y 4 = 1
не сохраняются от звонка до звонка! Зачем? Почему там сохраняются от вызова к вызову внутри std :: generate_n, и не сохраняются, когда я дважды вызываю std :: generate_n? Пелас, помоги мне,
как mutable
спецификация работает в лямбдах?
Задача ещё не решена.
Других решений пока нет …