2014-08-28 20 views
5

Sto provando a passare una funzione lambda con capture [&]. Qual è la dichiarazione corretta per una variabile che memorizza un lambda di cattura? [f2 sotto]C++ 11 Lambda Passing with Capture

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

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

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

+6

Lambda con catture non può essere convertito in puntatori di funzione. – user657267

+1

Nota che non stai cercando di passare una funzione lambda come riferimento. – juanchopanza

risposta

10

Il C++ standard, sezione § 5.1.2/6: [expr.prim.lambda]

Il tipo di chiusura per un non-generico lambda-espressione senza alcuna lambda-capture è disponibile una funzione di conversione const non esplicita pubblica non virtuale per puntare alla funzione con collegamento linguaggio C++ (7.5) con gli stessi parametri e tipi di ritorno dell'operatore di chiamata di funzione del tipo di chiusura. Il valore restituito da questa funzione di conversione deve essere l'indirizzo di una funzione che, quando viene richiamato, ha lo stesso effetto di invocare il suo tipo di chiusura dell'operatore funzione di chiamata

Dal momento che il lambda ha una cattura (uno di default: [&]) , non esiste un operatore di conversione per un puntatore alla funzione.


In alternativa, è possibile utilizzare std::function<> per avvolgere la lambda:

#include <functional> 
#include <iostream> 

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

Grazie. Era troppo prolisso per me da capire da solo. – RandomClown

Problemi correlati