2017-09-21 15 views
9
vector<int> vec; 

//a 
auto foo = [&vec](){ 
    //do something 
}; 

//b 
auto foo = [&v = vec](){ 
    //do something 
}; 

Tôi hiểu đúng rằng chỉ khác biệt giữa a và b là tạo bí danh "v" cho "vec" trong trường hợp b hoặc có nhiều hơn không?Sự khác biệt nào giữa việc chụp bởi [& capture] và bởi [& local = captured] trong lambdas?

+0

Có thêm thông tin về điều đó [ở đây] (http://en.cppreference.com/w/cpp/language/lambda#Lambda_capture) nhưng đoạn mã liên quan là * "Chụp với bộ khởi tạo hoạt động như thể nó khai báo và nắm bắt một biến rõ ràng với kiểu tự động, có vùng khai báo là phần tử của biểu thức lambda ..." * – CoryKramer

Trả lời

5

Về cơ bản không có. Nó chỉ ở đó để cho phép bạn cung cấp cho giá trị bắt được một tên tùy chỉnh.

Lưu ý tuy nhiên đó cú pháp này (được gọi là chụp init) là bắt buộc khi bạn muốn thực sự di chuyển một đối tượng vào việc đóng cửa:

std::vector<int> vector; 
auto lambda = [vec = std::move(vector)]() { /* the lambda owns the vector now */ }); 
+5

Điều này không ghi lại giá trị tài liệu tham khảo. Nó nắm bắt một giá trị được xây dựng bằng cách sử dụng một tham chiếu rvalue. –

+0

Đó là chính xác về mặt kỹ thuật. Tôi đã làm sáng tỏ câu trả lời. – Jodocus

+1

Tôi không chắc là tốt hơn. "Capture by reference" được lấy để có nghĩa là '[& vec_ref = vec_orig]', vì vậy mọi người sẽ mong đợi "capture bằng tham chiếu rvalue" để tạo một biến lambda capture chính nó là tham chiếu rvalue, nhưng một lần nữa, những gì bạn thực sự tạo ra là một giá trị . Nó chỉ xảy ra khi sử dụng hàm khởi tạo của nó bằng cách đưa RHS vào một tham chiếu rvalue. –

11

Trong trường hợp này không có sự khác biệt thực sự. Tuy nhiên, nếu bạn bị bắt giữ theo giá trị, sẽ có sự khác biệt:

const std::vector<int> vec; // note const 

auto foo = [vec]() mutable { 
    // can't change vec here since it is captured with cv-qualifiers 
}; 

auto bar = [v = vec]() mutable { 
    // can change v here since it is captured by auto deduction rules 
    // (cv-qualifiers dropped) 
}; 
Các vấn đề liên quan