В первом примере существует столько статических c переменных, сколько существует экземпляров лямбды. И их может быть много, потому что вы указываете параметр как auto
, что делает вашу лямбда своего рода шаблоном.
Третий код захватывает l
по значению каждый раз, когда создается лямбда, и создает его локальную копию, поэтому общий доступ к нему отсутствует.
Давайте посмотрим на пример. Давайте создадим функцию f()
с лямбдой, определенной внутри, и вызовем функцию дважды:
void f() {
//auto l1 = ...
l1(1);
l1(2);
l1(3);
l1('a');
l1('b');
l1('c');
}
f();
std::cout << "---" << std::endl;
f();
Этот код вызывает одну и ту же лямбду 3 раза со значением int
и 3 раза с char
.
Код 1: l
является общим для всех экземпляров, поэтому мы увидим 2 различных используемых переменных:
1 1
2 2
3 3
a 1
b 2
c 3
---
1 4
2 5
3 6
a 4
b 5
c 6
Второй вызов f()
позволяет повторно использовать stati c переменная, но есть две разные переменные для двух разных типов.
Код 2: l
- единственная переменная stati c, которая используется всеми лямбдами:
1 1
2 2
3 3
a 4
b 5
c 6
---
1 7
2 8
3 9
a 10
b 11
c 12
Код 3: у вас есть одна лямбда, созданная для каждого вызова функции, и эта лямбда использует единственный экземпляр переменной l
, который фиксируется во время создания:
1 1
2 2
3 3
a 4
b 5
c 6
---
1 1
2 2
3 3
a 4
b 5
c 6
Если вы запустите снова этот код, вы увидите, что l
воссоздается снова, и результат будет повторяться.