Tôi tự hỏi làm thế nào mọi người đang sử dụng C++ 0x lambdas, về mặt phong cách mã hóa. Câu hỏi thú vị nhất là cách triệt để khi viết danh sách chụp. Một mặt, ngôn ngữ cho phép liệt kê các biến được nắm bắt một cách rõ ràng, và bởi "rõ ràng là tốt hơn so với quy tắc ngầm", do đó sẽ có ý nghĩa để thực hiện một danh sách đầy đủ để nêu rõ nội dung. Ví dụ:C++ 0x lambdas mã hóa kiểu
int sum;
std::for_each(xs.begin(), xs.end(), [&sum](int x) { sum += x });
Một lý do khác cho việc này là, vì tuổi thọ của người dân địa phương ref-chụp không thay đổi chỉ vì họ đang bị bắt (và do đó, một lambda có thể dễ dàng kết thúc tham khảo một địa phương mà đời từ lâu đã kết thúc), làm cho việc chụp rõ ràng giúp giảm các lỗi đó và theo dõi chúng.
Mặt khác, ngôn ngữ cũng cố tình cung cấp phím tắt để tự động chụp tất cả người dân địa phương được tham chiếu, vì vậy rõ ràng nó được dự định sẽ được sử dụng. Và người ta có thể tuyên bố rằng đối với một ví dụ như ở trên, điều rất rõ ràng những gì xảy ra ngay cả với tự động chụp, và tuổi thọ của lambda là nó sẽ không vượt quá phạm vi xung quanh, vì vậy không có lý do gì để không sử dụng nó:
int sum;
std::for_each(xs.begin(), xs.end(), [&](int x) { sum += x });
rõ ràng điều này không phải là tất cả-hoặc-không có gì, nhưng phải có một số lý do để quyết định khi nào tự động chụp, và khi nào thì làm chụp một cách rõ ràng. Có suy nghĩ gì không?
Một câu hỏi khác trong cùng mạch là khi sử dụng tính năng chụp theo bản sao - [=]
và khi nào sử dụng tính năng chụp theo tham chiếu - [&]
. Capture-by-copy rõ ràng là an toàn hơn vì không có vấn đề suốt đời, vì vậy người ta có thể cho rằng nó nên được sử dụng theo mặc định bất cứ khi nào không cần phải thay đổi giá trị đã capture (hoặc xem những thay đổi được thực hiện từ nơi khác). tham chiếu không nên được coi là tối ưu hóa (có khả năng sớm) trong những trường hợp như vậy, chỉ được áp dụng khi nó tạo sự khác biệt rõ ràng. Mặt khác, capture-by-reference hầu như luôn luôn nhanh hơn (đặc biệt vì nó thường có thể được tối ưu hóa xuống một bản sao, nếu nó thực sự nhanh hơn, đối với các loại nhỏ và các chức năng mẫu không thể in được như hầu hết các thuật toán STL), và an toàn nếu lambda không bao giờ sống lâu hơn phạm vi của nó (cũng là trường hợp cho tất cả các thuật toán STL), vì vậy việc mặc định để capture-by-reference trong trường hợp này là một tối ưu hóa vô hại và không hại.
Suy nghĩ của bạn là gì?
Tôi đặc biệt quan tâm đến phản hồi từ những người đã sử dụng lambdas trong mã sản xuất, và do đó có một số kinh nghiệm ủng hộ quan điểm của họ; nhưng tất cả các thông tin phản hồi được chào đón. –
Lambdas không thực sự được triển khai trong nhiều trình biên dịch - tôi nghi ngờ bạn sẽ tìm thấy nhiều mã sản xuất cho đến khi G ++ hoặc MSVC++ hỗ trợ chúng ở ít nhất – bdonlan
MS hỗ trợ chúng trong VC10, nhưng người dùng sẽ không sử dụng các trình biên dịch beta cho mã sản xuất . Tương tự như vậy, ngay cả đối với các tính năng có trong g + +, tôi nghi ngờ rằng toàn bộ rất nhiều mã sản xuất đang sử dụng -std = C++ 0x. –