C++11拥有了一次性函数lambda,所以在面对回调函数的时候,直接给一个lambda可以降低整体类设计的复杂度。
但是如果回调接口是C语言,那么只有一种lambda可以作为回调,就是不带捕获的lambda。
如下:
void mainCB(void(*)(int)){};
{
main([](int){})();
}
如果带任何捕获,那么编译器做类型推导时会带着“lambda”标签,表明这是lambda函数,导致推导出的类型和回调类型不同。
而如果不带捕获,编译器会简单的把lambda表达式推导为普通函数,所以可以直接作为函数指针使用。
但是如果把lambda表达式传入std::function对象,那么不论有没有捕获,通过function->target返回的都是空,在底层代码可以看到,target传入的模板参数的typeid和function内保存的函数指针的typeid不同。