我需要使用一个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列表中添加[this]时,它不起作用!为什么?
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!
如果我添加[this],它会在VS2013中显示错误: 1智能感知:对于" [] void lambda(nReason LONG) - > void"不存在适当的转换功能。到" PAmsRouterNotificationFuncEx" f:\ Study \ omsPrinter.cpp 280
看起来很奇怪,谁能告诉我为什么?
答案 0 :(得分:5)
因为无状态的lambda会衰减到指针的功能,而有状态的则不会。捕获this
时,将lambda变为有状态,因为创建的闭包需要将指针存储在其中。当你什么都没有捕获时,闭包不需要存储任何东西,它可以像独立功能一样对待。