2016-06-21 22 views
14

Tôi nhìn vào như sau (có lẽ C++ 14) đoạn mãChuyển nhượng ở lambda

auto min_on = [](auto&& f) { 
    return [f=decltype(f)(f)](auto&& arg0, auto&&...args) { 
    // call your function here, using decltype(args)(args) to perfect forward 
    }; 
} 

sự phân kỳ lạ trong danh sách chụp lambda là gì? Tôi chưa bao giờ thấy bài tập trong danh sách chụp

f=decltype(f)(f) 

Cách này hoạt động?

+0

Khi bạn trả về một hàm, bạn có thể gọi nó ngay lập tức –

Trả lời

14

Đó là những gì được gọi là Generalized Lambda Capture và có, đó là C++ 14.

Về cơ bản, nó cho phép bạn tạo biến mới như một phần của danh sách chụp.

văn bản từ liên kết:

Trong C++ 11, lambdas không thể (dễ dàng) chụp bằng di chuyển. Trong C++ 14, chúng ta có capture lambda tổng quát không chỉ giải quyết vấn đề đó, nhưng cho phép bạn định nghĩa các biến cục bộ mới tùy ý trong đối tượng lambda . Ví dụ:

auto u = make_unique<some_type>(some, parameters); // a unique_ptr is move-only 
go.run([ u=move(u) ] { do_something_with(u); }); //move the unique_ptr into the lambda 

Trong ví dụ trên, chúng tôi giữ tên của biến u cùng bên trong lambda. Nhưng chúng tôi không giới hạn mà ... chúng ta có thể đổi tên biến:

go.run([ u2=move(u) ] { do_something_with(u2); }); // capture as "u2" 

Và chúng ta có thể thêm trạng thái mới tùy ý để đối tượng lambda, vì từng chụp tạo ra một kiểu suy luận biến địa phương mới bên trong lambda :

int x = 4; 
int z = [&r = x, y = x+1] { 
      r += 2;   // set x to 6; "R is for Renamed Ref" 
      return y+2;  // return 7 to initialize z 
     }(); // invoke lambda 

Trong trường hợp cụ thể của bạn, bạn có một lambda được trả lại một lambda. Lambda lồng nhau được chụp f (chỉ là một tham số trong lambda cha) bằng cách sử dụng cú pháp mới này.

+3

Tôi sẽ thêm 'decltype (f) (f)' trong ngữ cảnh này là cách viết 'std :: forward (f)' vì bạn có thể ' t thực sự đặt tên 'T'. – Brian

+0

@Brian mà 'T' là bạn đang nói về? – Dean

+0

@Dean loại suy luận cho trình giữ chỗ 'tự động'. – Brian

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