Les fonctions lambda peuvent-elles être récursives?

Duplication possible:
Fonctions lambda récursives en c ++ 0x

Voici une ancienne fonction récursive:

int fak(int n) { return (n <= 1) ? 1 : n * fak(n - 1); } 

Comment pourrais-je écrire une telle fonction récursive en tant que fonction lambda?

 [](int n) { return (n <= 1) ? 1 : n * operator()(n - 1); } // error: operator() not defined [](int n) { return (n <= 1) ? 1 : n * (*this)(n - 1); } // error: this wasn't captured for this lambda function 

Existe-t-il une expression qui dénote le lambda actuel pour qu’il puisse s’appeler récursivement?

Oui, ils peuvent. Vous pouvez le stocker dans une variable et référencer cette variable (bien que vous ne puissiez pas déclarer le type de cette variable comme auto , vous devrez plutôt utiliser un object std::function ). Par exemple:

 std::function factorial = [&] (int i) { return (i == 1) ? 1 : i * factorial(i - 1); }; 

Sinon, non, vous ne pouvez pas renvoyer le pointeur this depuis l’intérieur du corps de la lambda.