简短的回答
这仅意味着不捕获任何内容的 lambda 可以转换为具有相同签名的函数指针:
auto func = [](int x) { return x * 2; };
int (*func_ptr)(int) = func; // legal.
int y = func_ptr(2); // y is 4.
捕获使其非法:
int n = 2;
auto func = [=](int x) { return x * n; };
int (*func_ptr)(int) = func; // illegal, func captures n
长答案
Lambda 是创建函子的简写:
auto func = [](int x) { return x * 2; };
相当于:
struct func_type
{
int operator()(int x) const { return x * 2; }
}
func_type func = func_type();
在这种情况下func_type
是“闭合类型”and operator()
是“函数调用运算符”。当您获取 lambda 的地址时,就好像您声明了operator()
static 并获取其地址,就像任何其他函数一样:
struct func_type
{
static int f(int x) { return x * 2; }
}
int (*func_ptr)(int) = &func_type::f;
当您捕获变量时,它们将成为以下成员func_type
. operator()
取决于这些成员,因此不能将其设为静态:
struct func_type
{
int const m_n;
func_type(int n) : m_n(n) {}
int operator()(int x) const { return x * m_n; }
}
int n = 2;
auto func = func_type(n);
普通函数没有成员变量的概念。按照这个想法,如果 lambda 也没有成员变量,则只能将其视为普通函数。