Ho appena iniziato ad apprendere le nuove funzionalità in C++ 11. Stavo leggendo di lambda in C++ Primer (Stanley Lippman) e stavo sperimentando con loro.Espressioni lambda C++ - Come li interpreta il compilatore?
ho provato i seguenti pezzi di codice:
auto func() -> int (*)(){
//int c=0;
return []()-> int {return 0;};
}
int main(){
auto p = func();
}
Questo codice compilato bene. Quindi immagino che lambda senza catture vengano semplicemente generate come normali funzioni dal compilatore e possiamo usare un normale puntatore a loro funzione.
Ora ho cambiato il codice per utilizzare Cattura:
auto func() -> int (*)(){
int c=0;
return [=]()-> int {return c;};
}
int main(){
auto p = func();
}
Ma questo non è riuscito per la compilazione. Ho ottenuto il seguente errore di compilazione durante l'utilizzo di g ++:
main.cpp: In function ‘int (* func())()’:
main.cpp:6:31: error: cannot convert ‘func()::__lambda0’ to ‘int (*)()’ in return
return [=]()-> int {return c;};
Dal errore posso capire che non è una normale funzione che viene generato e potrebbe probabilmente essere una classe con una chiamata-operatore di overload. O è qualcos'altro?
Le mie domande: in che modo il compilatore gestisce internamente Lambdas? Come dovrei passare i lambda che usano le catture, quale dovrebbe essere il valore di ritorno da func()? Attualmente non posso pensare a un caso d'uso in cui avrei bisogno di usare lambda come questo, ma voglio solo capirne di più. Per favore aiuto.
Grazie.
Try questo link: http://www.cprogramming.com/c++11/c++11-lambda-closures.html –