Рекурсивные лямбда-функции в C ++ 14

Существует часто повторяемый трюк для написания рекурсивных лямбда-функций в C ++ 11, который выглядит следующим образом:

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

assert( factorial(5) == 120 );

(например.Рекурсивные лямбда-функции в C ++ 0x.)

Этот метод имеет два немедленных недостатка: цельstd::function<Sig> объект привязан (посредством захвата по ссылке) к оченьstd::function<Sig> объект (здесь,factorial). Это означает, что результирующий функтор обычно не может быть возвращен из функции, иначе ссылка останется висячей.

Другая (хотя и менее насущная) проблема заключается в том, что использованиеstd::function обычно собирается предотвратить оптимизацию компилятора, побочный эффект необходимости стирания типа в его реализации. Это не гипотетически и может быть легко проверено.

В гипотетической ситуации, когда рекурсивные лямбда-выражения действительно были бы удобны, есть ли способ решить эти проблемы?

Ответы на вопрос(2)

Ваш ответ на вопрос