2016-09-30 58 views
21

Hàng tiếp theo có nghĩa là gì?[&] có nghĩa là gì trước chức năng?

auto allowed = [&](int x, const std::vector<int>&vect){ 

.... 

} 

Ý tôi là, [&] làm gì? và nó có chức năng với cùng tên của biến ??

Bởi vì nó được sử dụng theo cách này: unsigned short ok = get_allowed(0, vect);

+1

Đó là một danh sách chụp cho một lambda (cf http: //en.cppreference.com/w/cpp/language/lambda) –

+0

Nó không phải là một hàm mà là một lambda. Bạn nên đọc lên trên những người – Hayt

+0

Chỉ cần một người đứng lên, tôi đóng [this] (http://stackoverflow.com/questions/12262019/c-operator) như là một dupe của câu hỏi này. IMHO câu trả lời ở đây là chi tiết hơn. – NathanOliver

Trả lời

45

Điều đó có nghĩa là hàm lambda sẽ nắm bắt tất cả các biến trong phạm vi tham chiếu.

Để sử dụng các biến khác ngoài những biến được chuyển đến lambda bên trong nó, chúng tôi có thể sử dụng capture-clause []. Bạn có thể chụp bởi cả hai tài liệu tham khảo và giá trị mà bạn có thể chỉ định sử dụng & và = tương ứng:

  • [=] chụp tất cả các biến trong phạm vi giá trị
  • [&] chụp tất cả các biến trong phạm vi bằng cách tham khảo
  • [&var] chụp var bằng cách tham chiếu
  • [&, var] chỉ định rằng mặc định cách chụp là tham chiếu và chúng tôi muốn chụp var
  • [=, &var] chụp các biến trong phạm vi giá trị theo mặc định, nhưng chụp var sử dụng tài liệu tham khảo thay
+0

Điểm tốt * theo tham chiếu *. Được thăng hạng. – Bathsheba

+0

Tất nhiên là thiếu một trong C++ 11 ít nhất là khả năng nắm bắt một biến thành viên lớp duy nhất. Bạn phải thất bại đối với các đối tượng hàm cũ trong trường hợp đó. – Bathsheba

+0

Chỉ đúng, chúng ta cần nắm bắt con trỏ 'this' trong trường hợp biến thành viên lớp. – user3286661

13

Đó là một danh sách chụp lambda và đã được định nghĩa trong C++ từ các tiêu chuẩn C++ 11.

[&] Điều đó có nghĩa là bạn muốn truy cập mọi biến bằng cách tham chiếu hiện nằm trong phạm vi trong hàm lambda.

Đó là công việc của bạn để đảm bảo rằng các đối tượng được giới thiệu vẫn còn trong phạm vi tại điểm đóng cửa được gọi, khác hành vi của chương trình là undefined.

5

Nó định nghĩa một biểu thức Lambda, mà về cơ bản là một chức năng mà không có một cái tên. Nó có danh sách tham số (int x, const std::vector<int>&vect) và phần thân hàm { ... }. Nhưng nó cũng có một danh sách chụp ở đầu [&]. Nếu bạn muốn truy cập một biến (không phải là một tham số) từ nội dung của biểu thức lambda, bạn phải làm cho biểu thức "lấy biến với chính nó", để biến có thể được sử dụng sau này khi biểu thức lambda sẽ Thực thi.

Bạn có thể cung cấp danh sách các biến hoặc sử dụng "tất cả" để nắm bắt tất cả các biến. [&] có nghĩa là chụp tất cả chúng bằng cách tham chiếu và [=] có nghĩa là chụp tất cả chúng theo giá trị.

(Nếu bạn sử dụng [&], lưu ý rằng phần thân lambda sẽ sử dụng giá trị của biến tại thời điểm lambda được thực thi và không phải là giá trị hợp lệ khi bạn tạo lambda! Điều này là do bạn không có một bản sao của giá trị, chỉ là một tham chiếu đến nó.)

+1

Được thăng hạng; điểm tốt đẹp được thực hiện ở cuối. Làm cảm thấy tự do để đề cập đến trường hợp tham chiếu lủng lẳng như tôi allude trong câu trả lời của tôi. – Bathsheba

+0

Upvoted cho điểm bạn đã thực hiện ở cuối là tốt. –

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