2014-08-28 15 views
5

Tôi đang cố gắng truyền chức năng lambda với chụp [&]. Khai báo chính xác cho một biến lưu trữ một lambda bắt là gì? [f2 bên dưới]C++ 11 Lambda Đi qua với Capture

// Non-capturing 
void (*f1)() = [](){ }; // Works 

// All by reference 
void (*f2)() = [&](){ }; // Syntax Error 
+5

auto f = [&]() {...}? – Kiroxas

+6

Lambdas có ảnh chụp không thể chuyển đổi thành con trỏ hàm. – user657267

+1

Lưu ý rằng bạn không cố gắng chuyển một hàm lambda bằng cách tham chiếu. – juanchopanza

Trả lời

10

CáC++ Chuẩn C, phần § 5.1.2/6: [expr.prim.lambda]

Kiểu đóng cửa cho một tổ chức phi-generic lambda-biểu không có lambda-capture có chức năng chuyển đổi const không ảo rõ ràng công khai tới con trỏ tới hàm với liên kết ngôn ngữ C++ (7.5) có cùng tham số và kiểu trả về như toán tử gọi hàm của kiểu đóng. Giá trị trả về bởi chức năng chuyển đổi này sẽ là địa chỉ của một hàm rằng, khi gọi, có tác dụng tương tự như cách gọi các loại đóng cửa của hàm operator gọi

Kể từ khi lambda của bạn có ảnh chụp (mặc định một: [&]) , không có toán tử chuyển đổi nào cho con trỏ hoạt động.


Ngoài ra, bạn có thể sử dụng std::function<> quấn lambda của bạn:

#include <functional> 
#include <iostream> 

int main() 
{ 
    int i = 42; 
    std::function<void(void)> f = [&](){ std::cout << i; }; 
    f(); 
} 
+2

Cảm ơn. Điều đó quá dài để tôi có thể tự hiểu. – RandomClown

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