Eventuali duplicati:
Recursive lambda functions in c++0xchiamata ricorsiva a lambda (C++ 11)
Perché non posso chiamare un lambda in modo ricorsivo se scrivo come:
auto a = [&]
{
static int i = 0; i++;
std::cout << i << std::endl;
if (i<10)
a(); //recursive call
};
Fornisce errore di compilazione (ideone):
prog.cpp:8:18: error: '((const main()::<lambda()>*)this)->main()::<lambda()>::a' cannot be used as a function
prog.cpp: In function 'int main()':
prog.cpp:9:9: error: variable 'auto a' with 'auto' type used in its own initializer
Che cosa significa l'errore?
capisco il motivo per cui non riesco a scrivere questo:
auto i=i+1; //error: unable to deduce 'auto' from '<expression error>'
Non possiamo scrivere questo perché il tipo di i
deve essere dedotta dalla sua inizializzazione, il che significa che il tipo non si può dedurre se i
appare nell'inizializzazione (ideone). Ma come importa in caso di lambda? Se non sbaglio, il tipo di lambda è determinato dal parametro (i) e dal tipo restituito; non dipende dal corpo se non restituisce nulla (nel qual caso il tipo di ritorno è dedotto come void
, indipendentemente dalle altre dichiarazioni nel corpo lambda).
In ogni caso, ho ottenuto una soluzione, e posso usare std::function
invece come:
std::function<void()> a = [&]
{
static int i = 0; i++;
std::cout << i << std::endl;
if (i<10)
a();
};
che compilare multe (ideone). Ma sono ancora interessato a conoscere il motivo per cui la versione auto
non viene compilata.
Penso che il problema sia legato a te che termina con una cattura implicita di 'a', come un riferimento che ricorrerebbe all'infinito perché' a' stesso finisce come membro di 'a'. – Flexo
@awoodland: cosa significa? Per favore, approfondisci. – Nawaz
Il tipo di lambda dipende anche dalle catture, che sospetto sia il problema qui. Se non usi 'a', allora al compilatore non interessa, ma quando lo fai non sa quale tipo di oggetto usare. –