C ++ 11 — C ++ понимание лямбда-мутабельный

Хорошо, как объяснил там Изменяемая спецификация позволяет изменять копии внешних переменных, и исходные переменные (не копии) не будут изменены.

Итак, я попробовал следующее:

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 спецификация работает в лямбдах?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]