当我尝试caputre〔this〕时,用于回调函数的lambda表达式失败,原因是什么
lambda expression used for callback function failed when I try to caputre [this],why?
我需要使用一个DLL库,它为我提供了一个回调函数,定义如下:
typedef void ( __stdcall *PAmsRouterNotificationFuncEx)( long nEvent );
用于注册给定回调函数的函数是:
bool RigisterStatusMonitorFunc(PAmsRouterNotificationFuncEx fpFuncAMS);
我试着这样称呼它(在按钮处理功能中):
auto fpTc2RouterCall = [](LONG nReason){
switch (nReason)
{
case AMSEVENT_ROUTERSTOP:
...
break;
case AMSEVENT_ROUTERSTART:
...
break;
case AMSEVENT_ROUTERREMOVED:
...
break;
default:
...
break;
}
};
…… ……
RigisterStatusMonitorFunc(fpTc2RouterCall); //It works.
但是当我把这个添加到caputure列表中时,它不起作用!为什么?
auto fpTc2RouterCall = [this](LONG nReason){
switch (nReason)
{
case AMSEVENT_ROUTERSTOP:
...
StopAMS(); //Member function of this class,I need call it in the lambda expression.
break;
case AMSEVENT_ROUTERSTART:
...
break;
case AMSEVENT_ROUTERREMOVED:
...
break;
default:
...
break;
}
};
…… ……
RigisterStatusMonitorFunc(fpTc2RouterCall); //It doesn't works!
如果我加上[这个],它会在VS2013中显示错误:1 IntelliSense:对于"[]void lambda(nReason LONG)->void"到"PAmsRouterNotificationFuncEx"f:\Study\omsPrinter.cpp 280 ,不存在适当的转换函数
这看起来很奇怪,有人能告诉我为什么吗?
因为无状态的lambda会衰减为函数指针,而有状态的则不会。当您捕获this
时,您将lambda转换为有状态的,因为创建的闭包需要在其中存储指针。当您不捕获任何内容时,闭包不需要存储任何内容,并且可以将其视为独立函数。
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 两组使用lambda函数的大括号
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- C++:Lambda 函数指针转换的用例是什么?
- 将 lambda 函数作为参数传递C++
- 如何将 lambda 函数作为参数发送到另一个函数
- 传递 lambda 函数的权衡是什么?
- 如何使用类模拟 C++11 中的 lambda 函数和闭包?
- 不是 lambda 函数中的常量表达式
- 如何使用可变参数数重载 lambda 函数?
- 如何通过指针传递lambda函数?
- 使用带有 lambda 函数指针的模板
- openmp c++ 中并行块内 lambda 函数的奇怪行为
- C++ 中 Lambda 函数中的溢出
- 将数组传递到 lambda 函数中
- lambda 函数未显示正确的结果