Могут ли лямбда-функции быть рекурсивными?

Возможный дубликат:
Рекурсивные лямбда-функции в С++ 0x

Вот простая старая рекурсивная функция:

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

Как написать такую ​​рекурсивную функцию, как лямбда-функцию?

[](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

Есть ли какое-либо выражение, которое обозначает текущую лямбда, чтобы он мог называть себя рекурсивно?

Ответ 1

Да, они могут. Вы можете сохранить его в переменной и ссылаться на эту переменную (хотя вы не можете объявить тип этой переменной как auto, вместо этого вам придется использовать объект std::function). Например:

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

В противном случае нет, вы не можете ссылаться на указатель this внутри тела лямбда.