Кажется, я пропустил какой-то момент в лямбда-механизме в С++. Вот код:
std::vector<int> vec (5);
int init = 0;
std::generate(begin(vec), end(vec), [init]() mutable { return ++init; });
for (auto item : vec) {
std::cout << item << " ";
}
std::cout << std::endl << init << std::endl;
Если нет mutable
, он не будет компилироваться, потому что я изменяю init
в lambda.
Теперь, поскольку я понимаю, что lambda вызывается для каждого элемента вектора с новой новой копией init
, которая равна 0.
Итак, 1 нужно возвращать каждый раз.
Но выход этого фрагмента кода:
1 2 3 4 5
0
Похоже, что generate
захватывает копию init
только один раз в начале ее выполнения. Но почему? Предполагается, что он работает так?