2014-08-28 10 views
5

Próbuję przekazać funkcję lambda z przechwytywaniem [&]. Jaka jest prawidłowa deklaracja dla zmiennej przechowującej przechwytującą lambdę? [F2 poniżej]C++ 11 Przechodzenie Lambdy z przechwytywaniem

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

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

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

+6

Lambdas z przechwytującymi nie można przekonwertować na wskaźniki funkcji. – user657267

+1

Uwaga: nie próbujesz przekazać funkcji lambda przez odniesienie. – juanchopanza

Odpowiedz

10

C++ Standard części § 5.1.2/6 [expr.prim.lambda]

typ zamknięcia dla nierodzajowego lambda ekspresji bez przechwytywania lambda ma publiczną nie-wirtualną, nie jawną funkcję konwersji stałej do wskaźnika na funkcję z łączem języka C++ (7.5) mającym ten sam parametr i typy zwracane, co operator wywołania funkcji typu zamknięcia. Wartość zwracana przez tę funkcję konwersji powinien być adres funkcji, która, gdy wywoływany, ma taki sam efekt jak wywoływanie typ zamknięcia operator wywołania funkcji

Od twojej lambda ma przechwytywania (a domyślna: [&]) , nie ma operatora konwersji do wskaźnika do funkcji.


Alternatywnie, można użyć std::function<> owinąć lambda:

#include <functional> 
#include <iostream> 

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

Dzięki. To było zbyt rozwlekłe, bym mógł to zrozumieć na własną rękę. – RandomClown