Существует много повторяющийся "трюк" для записи рекурсивных лямбда-функций в С++ 11, который выглядит следующим образом:
std::function<int(int)> factorial;
factorial = [&factorial](int n)
{ return n < 2 ? 1 : n * factorial(n - 1); };
assert( factorial(5) == 120 );
(например, Рекурсивные лямбда-функции в С++ 0x.)
Этот метод имеет два непосредственных недостатка: цель объекта std::function<Sig>
привязана (через захват по ссылке) к особому объекту std::function<Sig>
(здесь factorial
). Это означает, что полученный функтор обычно не может быть возвращен из функции, иначе ссылка будет оставлена висевшей.
Другая (хотя и менее непосредственная) проблема заключается в том, что использование std::function
обычно предотвращает оптимизацию компилятора, побочный эффект необходимости стирания стилей в его реализации. Это не гипотетично и может быть легко протестировано.
В гипотетической ситуации, когда рекурсивные лямбда-выражения действительно будут удобны, есть ли способ решить эти проблемы?