Sao chụp-by-value giá trị const, nhưng bị bắt-by-reference đối tượng không được phép:Lambda: Tại sao giá trị được ghi lại bởi giá trị const, nhưng giá trị theo từng tham chiếu không?
int a;
auto compile_error = [=]()
{
a = 1;
}
auto compiles_ok = [&]()
{
a = 1;
}
Đối với tôi này dường như vô lý nhưng nó dường như là tiêu chuẩn? Đặc biệt là sự sửa đổi không mong muốn của một giá trị bắt được có thể là một lỗi gây phiền nhiễu, nhưng rất có thể là hậu quả bị giới hạn trong phạm vi lambda, trong khi việc sửa đổi không mong muốn đối tượng bị bắt bằng tham chiếu sẽ dẫn đến các hiệu ứng nghiêm trọng hơn.
Vậy tại sao không chụp bằng tham chiếu const cho mỗi mặc định? Hoặc ít nhất hỗ trợ [const &] và [&]? Lý do cho thiết kế này là gì?
Vì cách giải quyết khác, bạn có thể phải sử dụng tham chiếu std :: cref được bao bọc bởi giá trị?
Phần lớn điểm trong việc chụp tham chiếu đang thay đổi nó. Có * không * lý do để thay đổi một giá trị - nó là vô nghĩa. – Elazar
Tài liệu tham khảo là không thay đổi và không bao giờ có thể thay đổi sau khi bị ràng buộc. Vì vậy, trong một cảm giác lambda biểu hiện phù hợp với phần còn lại của ngôn ngữ ở đây. Bạn có thể muốn tìm hiểu ý nghĩa của 'mutable' cho các biểu thức lambda. –
@Elazar: Các giá trị tạm thời có thể thay đổi, nhưng vẫn như bạn đề xuất không có vấn đề gì để thay đổi giá trị, trong khi thay đổi một đối tượng tham chiếu thực sự tác động đến các phạm vi khác có thể không mong muốn (lỗi). – valoh