用于回调函数的lambda表达式在我试图加载[this]时失败了,为什么?

时间:2015-12-25 13:51:22

标签: c++ lambda

我需要使用一个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

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

1 个答案:

答案 0 :(得分:5)

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