2012-11-04 26 views
5

Như tôi đã hiểu, [=] sao chép tất cả các biến được sử dụng trong nội dung hàm, trong khi [this] chỉ sao chép con trỏ this. Nhưng nhìn vào các mẫu, tôi thấy [=] được sử dụng rộng rãi trong đó [this] hoặc [this, foo] sẽ là đủ. Có bất kỳ lý do nào (ví dụ: đạt được hiệu suất) để sử dụng [this] thay vì [=]?Có hiệu suất đạt được nếu tôi sử dụng [this] thay vì [=] trong các hàm lambda không?

+0

Ý bạn là gì bởi "tất cả các biến tham chiếu"? Ý bạn là nói về '[&]'? –

+0

@Lightness: Tôi nghĩ rằng đó là một lỗi đánh máy và ông có nghĩa là "tham chiếu", bất cứ điều gì khác sẽ không thực sự có ý nghĩa. – Xeo

+0

@Xeo: Thật vậy. Tôi sẽ tiếp tục và thay đổi từ ngữ đó cho anh ta. –

Trả lời

10

Không đạt được hiệu suất, vì như bạn đã nói, chỉ các biến mà bạn thực sự sử dụng bên trong lambda mới được sao chép cho [=]. Đó là phần lớn sự lười biếng trên phần của người lập trình và giữ cho đầu lambda súc tích. Nếu bạn sử dụng các biến mới, bạn sẽ phải mở rộng mệnh đề chụp để bao gồm các biến đó và meh. Tuy nhiên, đôi khi, bạn muốn/phải rõ ràng, ví dụ: khi bạn muốn kết hợp tham chiếu theo tham chiếu và theo giá trị.


† Lưu ý rằng hiện nay, các [=] (hoặc thậm chí [x]) trong đoạn mã sau sẽ không sao chép các biến thành viên vào lambda, trái với những gì bạn có thể mong đợi:

struct X{ 
    std::function<void()> f(){ 
    return [=]{ std::cout << "x: " << x << "\n"; }; 
    } 

    int x; 
}; 

Thay vào đó , bạn sẽ nhận được một bản sao của this. Điều này có thể gây ra vấn đề nếu lambda outlives đối tượng cha mẹ, và để làm cho nó hoạt động chính xác, bạn hiện đang cần phải thực hiện một tên địa phương bên trong cơ thể của f và nắm bắt/sử dụng đó. Tên này có thể là một tham chiếu hoặc một giá trị. Tôi thích tham chiếu, vì nó là một bản sao ít hơn (để tham chiếu, thành viên sẽ được sao chép chỉ vào lambda, trong khi đối với giá trị, thành viên được sao chép đầu tiên và sau đó được sao chép vào lambda).

struct X{ 
    std::function<void()> f(){ 
    auto& x_ref = x; 
    return [=]{ std::cout << "x: " << x_ref << "\n"; }; 
    } 

    int x; 
}; 

Tuy nhiên, there is a proposal để làm cho khoản chụp [=][member_name] sao chép các thành viên. Nếu bạn muốn tham khảo, bạn cần phải chụp [this].


‡ Cảm ơn @MooingDuck vì sự khai sáng.

+0

"và meh" thực sự. Khá đúng! +1 –

+0

Oh điều đó rất thú vị về việc chụp thành viên - có ý nghĩa nhưng không phải là thứ bạn cần nhất định tại chỗ cho đến khi bạn đọc về nó trên Stack Overflow. cảm ơn –

+0

Điều đó thật nhanh, cảm ơn. – kiewic

Các vấn đề liên quan