Как уже ответил Джеймс, только необработанные лямбды могут быть преобразованы в указатели функций.Лямбды с состоянием создают объекты-функторы, которые реализуют operator()
, и указатели на функции-члены несовместимы с указателями свободных функций.
Когда компилятор обрабатывает: [&](int n){ r = n; }
, он генерирует что-то вроде:
class __annonymous_lambda_type {
int & r;
public:
__annonymous_lambda_type( int & r ) : r(r) {}
void operator()( int n ) const {
r = n;
}
} __lambda_instatiation;
Класс необходим для хранения состояния лямбды, в этом случае ссылка на внешний объект, который будет изменен при выполнении лямбды.То, что void operator()(int)
не может быть привязано к void (*)(int)
.
С другой стороны, если лямбда не имеет состояния, она может быть реализована как свободная функция, как в случае []( int n ) { std::cout << "Hi" << n << std::endl ; }
void __annonymous_lambda_function( int n ) {
std::cout << "Hi " << n << std::endl;
}
Поскольку лямбда вообще не нуждается в каком-либо состоянии, и поэтому она может быть сохранена как простая функция.