Вы должны понять, что означает захват!это захват не передачи аргументов!давайте рассмотрим несколько примеров кода:
int main()
{
using namespace std;
int x = 5;
int y;
auto lamb = [x]() {return x + 5; };
y= lamb();
cout << y<<","<< x << endl; //outputs 10,5
x = 20;
y = lamb();
cout << y << "," << x << endl; //output 10,20
}
Как вы можете видеть, хотя x
было изменено на 20
, лямбда все еще возвращает 10 (x
все еще 5
внутри лямбды) Изменение x
внутри лямбды означает изменение самой лямбды при каждом вызове (лямбда мутирует при каждом вызове).Для обеспечения корректности стандарт ввел ключевое слово mutable
.Указывая лямбду как изменчивую, вы говорите, что каждый вызов лямбды может вызвать изменение самой лямбды.Давайте рассмотрим другой пример:
int main()
{
using namespace std;
int x = 5;
int y;
auto lamb = [x]() mutable {return x++ + 5; };
y= lamb();
cout << y<<","<< x << endl; //outputs 10,5
x = 20;
y = lamb();
cout << y << "," << x << endl; //outputs 11,20
}
Приведенный выше пример показывает, что, делая лямбду мутабельной, изменение x
внутри лямбды «мутирует» лямбда при каждом вызове с новым значением x
, которое имеетне имеет ничего общего с фактическим значением x
в основной функции