Захват лямбды
Захват лямбды определяет, какие внешние переменные
будут доступны внутри тела лямбда-выражения.
Захват указывается в квадратных скобках после
ключевого слова []. Внутри скобок можно
перечислить конкретные переменные или использовать
специальные символы: '=' для захвата по значению
и '&' для захвата по ссылке. Также можно
комбинировать оба способа и захватывать переменные
с указанием их имени.
Синтаксис
[&] { /* capture all by reference */ }
[=] { /* capture all by value */ }
[x, &y] { /* capture x by value, y by reference */ }
[&, x] { /* capture all by reference, x by value */ }
[=, &y] { /* capture all by value, y by reference */ }
Пример
Давайте захватим переменную по значению и выведем её внутри лямбды:
#include <iostream>
using namespace std;
int main()
{
int x = 5;
auto func = [x]() {
cout << x << endl;
};
func();
return 0;
}
Результат выполнения кода:
5
Пример
Давайте захватим переменную по ссылке и изменим её внутри лямбды:
#include <iostream>
using namespace std;
int main()
{
int x = 5;
auto func = [&x]() {
x = 10;
};
func();
cout << x << endl;
return 0;
}
Результат выполнения кода:
10
Пример
Давайте захватим все переменные по значению
с помощью символа '=':
#include <iostream>
using namespace std;
int main()
{
int x = 5;
int y = 10;
auto func = [=]() {
cout << x + y << endl;
};
func();
return 0;
}
Результат выполнения кода:
15
Пример
Давайте захватим все переменные по ссылке
с помощью символа '&' и изменим их:
#include <iostream>
using namespace std;
int main()
{
int x = 5;
int y = 10;
auto func = [&]() {
x = 20;
y = 30;
};
func();
cout << x << " " << y << endl;
return 0;
}
Результат выполнения кода:
20 30
Пример
Давайте скомбинируем захват: все по ссылке,
а переменную x - по значению:
#include <iostream>
using namespace std;
int main()
{
int x = 5;
int y = 10;
auto func = [&, x]() {
cout << x << " " << y << endl;
};
func();
return 0;
}
Результат выполнения кода:
5 10