У вас уже есть хорошие ответы. Следующее - это просто любопытство, но я бы не предложил вам его использовать.
Как сказал другие, лямбда factorial
пытается захватить себя и, следовательно, не является апатридом. Поэтому он не конвертируется в указатель функции.
Лямбда не нужно захватить глобальные или static
объекты, так что если вы сделаете factorial
глобальный или static
переменную, то вам не нужно, чтобы захватить его, и это работает отлично (GCC 4.7.2)
#include <iostream>
typedef int (*function)(int);
int main() {
static function factorial = [](int x){
return (x < 2) ? 1 : x * factorial(x - 1);
};
std::cout << factorial(5) << '\n';
}
вы также можете создать фабрику так:
#include <iostream>
typedef int (*function)(int);
function make_factorial() {
static function factorial = [](int x){
return (x < 2) ? 1 : x * factorial(x - 1);
};
return factorial;
}
int main() {
auto factorial = make_factorial();
std::cout << factorial(5) << '\n';
}
Если вы хотите, чтобы запутать еще больше :-) затем устранить typedef
:
// This is a function returning a pointer to a function taking an int and returning an int.
int (*(make_factorial)())(int) {
static int (*factorial)(int) = [](int x){
return (x < 2) ? 1 : x * factorial(x - 1);
};
return factorial;
}
Лямбда может быть преобразована в указатель функции, если она ничего не захватывает. – jrok
Круто, ты прав. Полезно знать, спасибо. – sircodesalot
Это почти дубликат http://stackoverflow.com/questions/2067988/recursive-lambda-functions-in-c0x – doctorlove