Lambdas là đường cú pháp cho lớp không thể đặt tên và trường hợp của chúng. Đôi khi, mở rộng mã của bạn ra ngoài với những gì lớp học không thể đặt tên này có thể giúp hiểu những gì đang xảy ra.
[ capture_list ](arg_list) -> return_value_clause_opt { body };
trở nên rất gần (pseudo-code):
struct anonymous_type {
capture_list;
auto operator()(arg_list) const -> return_value_clause_opt {
body
}
anonymous_type(capture_list_in):capture_list(capture_list_in) {}
};
Nếu bạn liệt kê một biến trong capture_list
theo tên đơn giản của nó, nó là sao chép vào một bản sao trong lớp nặc danh.
Vì vậy timesFive
của bạn trở thành
struct __secret_name__ {
int multiplier;
int operator()(int a) const { return a*multiplier; }
};
int multiplier = 5;
auto timesFive = __secret_name__{multiplier};
Nó nên được khá rõ ràng rằng việc thay đổi multiplier
trong đoạn mã trên sẽ không thay đổi hành vi của timesFive
.
Nếu bạn đặt &
ở phía trước tên, tài khoản không const
tham chiếu được đặt trong lớp ẩn danh.
struct __secret_name__ {
int& multiplier;
int operator()(int a) const { return a*multiplier; }
};
int multiplier = 5;
auto timesFive = __secret_name__{multiplier};
bây giờ, thay đổi multiplier
sẽ thay đổi hành vi của timesFive
, vì timesFive
nắm giữ một tài liệu tham khảo để Multiplier, không phải là một bản sao của nó.
Một số chi tiết bỏ qua ở trên để ngắn gọn. Tên __secret_name__
chỉ dành cho giải trình. Các biến thành viên của lamba không thực sự là công khai. Các lambda được trivially constructible được thực hiện được xác định ngay cả khi dữ liệu của nó được. Vv
Hãy đặt tiêu đề mô tả vấn đề. Có, bạn đang cố gắng hiểu lambdas, nhưng điều đó không cho chúng tôi biết nhiều về những gì bạn đang thực sự yêu cầu. (Tôi đang xem xét tự chỉnh sửa bản thân mình, nhưng tôi không thích những ý tưởng mà tôi đã đưa ra). – jpmc26