2014-08-28 88 views
5

我想通過一個帶捕獲的lambda函數[&]。什麼是存儲捕獲lambda的變量的正確聲明? [下面F2]C++ 11 Lambda通過捕獲

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

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

汽車F = [&](){...}? – Kiroxas 2014-08-28 10:14:14

+6

帶捕捉的Lambdas不能轉換爲函數指針。 – user657267 2014-08-28 10:15:13

+1

請注意,您並未嘗試通過引用傳遞lambda函數。 – juanchopanza 2014-08-28 10:19:20

回答

10

C++標準,部分§5.1.2/6:[expr.prim.lambda]

該閉合類型的非通用的λ-表達沒有lambda捕獲具有公共的非虛擬非顯式const轉換函數指向函數與C++語言鏈接(7.5)具有相同的參數和返回類型作爲閉包類型的函數調用操作符。通過這種轉換函數的返回值應是一個函數調用時,與調用閉合類型的函數調用操作

由於您的拉姆達的效果相同的地址有捕獲(默認之一:[&]) ,沒有轉換操作符到指向函數的指針。


或者,您可以使用std::function<>來包裝你的λ:

#include <functional> 
#include <iostream> 

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

謝謝。這太羅嗦了,我自己無法理解。 – RandomClown 2014-08-28 10:34:45