Согласно стандарту С++ 11, лямбда-выражения могут использовать переменные в охватывающей области, с помощью списка захвата, списка параметров или обоих.
Итак, рассмотрим две версии одного и того же кода.
1) С захватом
int x = 4;
cout << "With capture : Factorial of " << x << " = " << [x]() // <= Capture
{
int r = 1;
for (int i = x; i > 1; i--) r = r * i;
return r;
}() << endl;
2) С параметром
int x = 4;
cout << "With parameter: Factorial of " << x << " = " << [](int x) // <= Parameter
{
int r = 1;
for (int i = x; i > 1; i--) r = r * i;
return r;
}(x) << endl;
Вывод:
With capture : Factorial of 4 = 24
With parameter: Factorial of 4 = 24
Так как мы можем передавать параметры в lambdas в списке параметров (как и в случае любой функции С++), зачем нам нужен список захвата?
Может ли кто-нибудь показать мне случаи, когда список параметров не работает, и только список захвата делает?