将const函数引用绑定到lambda

时间:2019-07-01 04:33:22

标签: c++ c++11 lambda

此代码

int(&foo)(int, int) = [](int a, int b) { return a + b; };

不会编译,因为显然不能使用临时初始化非常量引用。 const放在哪里?

2 个答案:

答案 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; }; 

也是一个不错的选择。

希望对您有帮助!