当我尝试caputre〔this〕时,用于回调函数的lambda表达式失败,原因是什么

lambda expression used for callback function failed when I try to caputre [this],why?

本文关键字:lambda 函数 表达式 失败 是什么 回调 用于 caputre this      更新时间:2023-10-16

我需要使用一个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转换为有状态的,因为创建的闭包需要在其中存储指针。当您不捕获任何内容时,闭包不需要存储任何内容,并且可以将其视为独立函数。