Sự lựa chọn giữa lambda và functor-class là một sự đánh đổi.
Thu được từ lambda chủ yếu là cú pháp, bằng cách giảm thiểu số lượng soạn sẵn và cho phép mã liên quan đến khái niệm được viết nội tuyến, bên trong hàm sẽ sử dụng nó (ngay lập tức hoặc sau đó).
Hiệu năng-khôn ngoan, điều này không tệ hơn một lớp functor , đó là một cấu trúc hoặc lớp C ++ có chứa một "phương thức" duy nhất. Trong thực tế, trình biên dịch đối xử với lambda không khác gì một lớp functor do trình biên dịch tạo ra đằng sau hậu trường.
// define the functor method somewhere
struct some_computer_generated_gibberish_0123456789
{
int operator() (int x) const
{
if (x == 2) return 5;
if (x == 3) return 6;
return 0;
}
};
// make a call
some_computer_generated_gibberish_0123456789 an_instance_of_0123456789;
int outputValue = an_instance_of_0123456789(inputValue);
Trong ví dụ mã của bạn, hiệu năng-khôn ngoan, nó không khác gì một hàm gọi, bởi vì lớp functor đó không có trạng thái (vì nó có một mệnh đề bắt trống), do đó không yêu cầu phân bổ, hàm tạo cũng như hủy.
int some_computer_generated_gibberish_0123456789_method_more_gibberish(int x)
{
if (...) return ...;
return ...;
}
Gỡ lỗi bất kỳ mã C ++ không tầm thường nào bằng cách sử dụng trình dịch ngược mã luôn là một nhiệm vụ khó khăn. Điều này đúng với hoặc không sử dụng lambda. Điều này được gây ra bởi việc tối ưu hóa mã tinh vi bởi trình biên dịch C ++ dẫn đến việc sắp xếp lại, xen kẽ và loại bỏ mã chết.
Khía cạnh xáo trộn tên là hơi khó chấp nhận và hỗ trợ trình gỡ lỗi cho lambda vẫn còn ở giai đoạn sơ khai . Chỉ có thể hy vọng rằng sự hỗ trợ của trình gỡ lỗi sẽ cải thiện theo thời gian.
Hiện tại, cách tốt nhất để gỡ lỗi mã lambda là sử dụng trình gỡ lỗi hỗ trợ đặt điểm dừng ở cấp mã nguồn, tức là bằng cách chỉ định tên tệp nguồn và số dòng.