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

Wuying283

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

但是,当我在捕获列表中添加[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 IntelliSense:不存在将[[] void lambda(nReason LONG)-> void“转换为” PAmsRouterNotificationFuncEx“的适当转换函数f:\ Study \ omsPrinter.cpp 280

似乎很奇怪,谁能告诉我为什么?

米哈伊尔

因为无状态lambda会衰减到函数指针,而有状态则不会。捕获时this,会将lambda转换为有状态的,因为创建的闭包需要将指针存储在其中。当您不捕获任何内容时,闭包不需要存储任何内容,并且它可以与独立函数一样对待。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我使用 lambda 表达式而不是函数?

来自分类Dev

Swift:尝试将元组传递给回调函数时出现“歧义表达式”

来自分类Dev

当我使用javascript登录时,为什么类和函数中的函数具有不同的表达式?

来自分类Dev

为什么在尝试启动码头时,lambda表达式会破坏guice错误处理?

来自分类Dev

当我尝试删除元素时出错

来自分类Dev

当我尝试使用C中的参数调用函数时,出现错误“错误:...之前的预期表达式”

来自分类Dev

当我告诉我不是正则表达式时,为什么这么贪婪?

来自分类Dev

当我尝试调用我的函数时,为什么会出现“未定义”?

来自分类Dev

为什么此SELECT查询有效,但当我尝试SELECT INTO时却失败?

来自分类Dev

当我尝试配置rabbitmq时docker构建失败

来自分类Dev

当我尝试解析JSON时,我得到JSONException

来自分类Dev

当我尝试编译我的代码时发生错误

来自分类Dev

当我尝试构建我的角度代码时 OutOfMemoryKilled

来自分类Dev

当我尝试向函数传递所传递数组的长度时,为什么会出现错误?

来自分类Dev

当我尝试调用此函数时,为什么会收到 NoneType object is not callable 的错误消息?

来自分类Dev

为什么当我尝试释放矩阵时会显示错误?

来自分类Dev

AttributeError:__exit__当我尝试模拟内置函数时

来自分类Dev

AttributeError:__exit__当我尝试模拟内置函数时

来自分类Dev

为什么当我尝试显示我的 ip usig Inet 时我的应用程序崩溃?

来自分类Dev

当我尝试导航到第三级实体属性时,在Include方法内找不到带有lambda表达式的Select方法

来自分类Dev

Python:当我尝试将它应用于 http 请求时,try-except 表达式总是获得默认值

来自分类Dev

为什么我的回调不是函数?

来自分类Dev

当我尝试评估一个简单的MVEL表达式时,出现错误:无法访问:名称

来自分类Dev

当我尝试签入更改时,SVN失败..?

来自分类Dev

为什么当我尝试更改采样率时sox会损坏我的wav文件?

来自分类Dev

当我尝试使用dplyr按组求和时,为什么dplyr忽略了我的组?

来自分类Dev

当我尝试从班级外部访问字段时,为什么没有调用我的getter方法?

来自分类Dev

当我尝试删除[]数组时,为什么我的程序会抛出SIGABRT?

来自分类Dev

当我尝试在结构数组中提供值时,为什么我的程序停止了?

Related 相关文章

  1. 1

    为什么我使用 lambda 表达式而不是函数?

  2. 2

    Swift:尝试将元组传递给回调函数时出现“歧义表达式”

  3. 3

    当我使用javascript登录时,为什么类和函数中的函数具有不同的表达式?

  4. 4

    为什么在尝试启动码头时,lambda表达式会破坏guice错误处理?

  5. 5

    当我尝试删除元素时出错

  6. 6

    当我尝试使用C中的参数调用函数时,出现错误“错误:...之前的预期表达式”

  7. 7

    当我告诉我不是正则表达式时,为什么这么贪婪?

  8. 8

    当我尝试调用我的函数时,为什么会出现“未定义”?

  9. 9

    为什么此SELECT查询有效,但当我尝试SELECT INTO时却失败?

  10. 10

    当我尝试配置rabbitmq时docker构建失败

  11. 11

    当我尝试解析JSON时,我得到JSONException

  12. 12

    当我尝试编译我的代码时发生错误

  13. 13

    当我尝试构建我的角度代码时 OutOfMemoryKilled

  14. 14

    当我尝试向函数传递所传递数组的长度时,为什么会出现错误?

  15. 15

    当我尝试调用此函数时,为什么会收到 NoneType object is not callable 的错误消息?

  16. 16

    为什么当我尝试释放矩阵时会显示错误?

  17. 17

    AttributeError:__exit__当我尝试模拟内置函数时

  18. 18

    AttributeError:__exit__当我尝试模拟内置函数时

  19. 19

    为什么当我尝试显示我的 ip usig Inet 时我的应用程序崩溃?

  20. 20

    当我尝试导航到第三级实体属性时,在Include方法内找不到带有lambda表达式的Select方法

  21. 21

    Python:当我尝试将它应用于 http 请求时,try-except 表达式总是获得默认值

  22. 22

    为什么我的回调不是函数?

  23. 23

    当我尝试评估一个简单的MVEL表达式时,出现错误:无法访问:名称

  24. 24

    当我尝试签入更改时,SVN失败..?

  25. 25

    为什么当我尝试更改采样率时sox会损坏我的wav文件?

  26. 26

    当我尝试使用dplyr按组求和时,为什么dplyr忽略了我的组?

  27. 27

    当我尝试从班级外部访问字段时,为什么没有调用我的getter方法?

  28. 28

    当我尝试删除[]数组时,为什么我的程序会抛出SIGABRT?

  29. 29

    当我尝试在结构数组中提供值时,为什么我的程序停止了?

热门标签

归档