用于回调函数的lambda表达式失败,当我尝试caputre [this]时,为什么?

Wuy*_*283 2 c++ lambda

我需要使用一个DLL库,它给我一个定义如下的回调函数:

typedef void  ( __stdcall *PAmsRouterNotificationFuncEx)( long nEvent );
Run Code Online (Sandbox Code Playgroud)

用于注册回调函数的函数是:

bool RigisterStatusMonitorFunc(PAmsRouterNotificationFuncEx fpFuncAMS);
Run Code Online (Sandbox Code Playgroud)

我试着像这样调用它(在一个按钮处理函数中):

auto fpTc2RouterCall = [](LONG nReason){
    switch (nReason)
    {
    case AMSEVENT_ROUTERSTOP:
        ...
        break;
    case AMSEVENT_ROUTERSTART:
        ...
        break;
    case AMSEVENT_ROUTERREMOVED:
        ...
        break;
    default:
        ...
        break;
    }
};
…… ……

RigisterStatusMonitorFunc(fpTc2RouterCall);  //It works.
Run Code Online (Sandbox Code Playgroud)

但是当我在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!
Run Code Online (Sandbox Code Playgroud)

如果我添加[this],它表示VS2013中的错误:1智能感知:对于"[] void lambda(nReason LONG) - > void"到"PAmsRouterNotificationFuncEx"f:\ Study\omsPrinter.cpp 280不存在适当的转换函数

这看起来很奇怪,谁能告诉我为什么?

Mik*_*ail 5

因为无状态的lambda会衰变为函数指针,而有状态的则不会.捕获时this,将lambda变为有状态,因为创建的闭包需要将指针存储在其中.当你什么都没有捕获时,闭包不需要存储任何东西,它可以像独立功能一样对待.