此代码
int(&foo)(int, int) = [](int a, int b) { return a + b; };
不会编译,因为显然不能使用临时初始化非常量引用。 const
放在哪里?
答案 0 :(得分:24)
如前所述,无捕获的lambda可转换为函数指针。因此,如果要将静态函数绑定到引用,则需要取消引用指针。
int(&foo)(int, int) = *[](int a, int b) { return a + b; };
将*
应用于lambda会导致一堆机器。由于lambda不会重载operator*
,但会实现对指针类型的转换,因此会发生这种转换。然后*
应用于返回的指针,并产生一个函数左值。然后,该左值可以绑定到引用。
这里是live。
答案 1 :(得分:11)
lambda如果不能捕获,则只能转换为函数指针。
没有lambda-capture的lambda表达式的闭包类型具有指向该函数的指针的公共非虚拟非显式const转换函数,该函数具有与闭包类型的函数调用操作符相同的参数和返回类型。此转换函数返回的值应该是一个函数的地址,该函数在被调用时与调用闭包类型的函数调用操作符
具有相同的作用
[Lambda Functions][1]
我按如下所示更改了您的代码,并且该代码有效。
int (*foo)(int, int)= [] (int a, int b) { return a + b; };
int main()
{
cout << "Res:: " << foo(10,20);
return 0;
}
我只是使它成为函数指针。
或者,
auto foo = [](int a, int b) { return a + b; };
也是一个不错的选择。
希望对您有帮助!