Theo tiêu chuẩn C++ 11, biểu thức lambda có thể sử dụng biến trong phạm vi bao quanh, bằng danh sách chụp, danh sách tham số hoặc cả hai.C++ Lambdas: danh sách chụp và danh sách tham số
Vì vậy, hãy xem xét hai phiên bản của cùng một mã.
1) Với chụp
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) Với tham số
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;
Đầu ra là:
With capture : Factorial of 4 = 24
With parameter: Factorial of 4 = 24
Kể từ khi chúng ta có thể vượt qua các thông số để lambdas trong danh sách tham số (chỉ như với bất kỳ hàm C++ nào), tại sao chúng ta cần danh sách chụp?
Ai đó có thể hiển thị cho tôi các trường hợp danh sách tham số không hoạt động và chỉ danh sách chụp không?
chúng ta không thể chuyển cả 'int' và 'factor' vào danh sách tham số và để trống không? –
@ Xicod'Abrolha Làm thế nào? Bạn không gọi lambda, 'std :: find_if' đang thực hiện nó. Làm thế nào bạn sẽ làm cho nó gọi chức năng khác nhau? – Angew
không có Xico, bạn không thể! trong mã find_if một nơi nào đó bạn có cái gì đó gọi lambda của bạn (hoặc chức năng) như thế này: xử lý (giá trị); cho mỗi giá trị trong phạm vi bắt đầu/kết thúc. –