C ++ Lambda,捕获子句如何深入内部

时间:2018-07-04 11:44:03

标签: c++ lambda

当我有这样的回调函数时:

using MessageCallback =
    std::function<void(const Message &, uint64_t deliveryTag, bool redelivered)>;

我可以在一个类中声明一个静态回调函数:

static void MessageCB(const AMQP::Message &message,
                      uint64_t deliveryTag,
                      bool redelivered)
{...}

但是我无法访问此回调函数中的任何成员变量。

当我这样编写Lambda函数时:

 auto MessageCB= [&](const AMQP::Message &message,
                      uint64_t deliveryTag,
                      bool redelivered)
 {...}

然后我可以使用声明lambda的上下文中的任何成员变量。

这是如何工作的? 捕获子句的工作原理如何?

与静态回调函数有什么区别?

2 个答案:

答案 0 :(得分:3)

This cpp reference page解释了Lambda表达式的形成方式,以下摘录自 captures 部分(我强调):

  

[&]通过引用捕获lambda主体中使用的所有自动变量,如果存在,则通过引用捕获当前对象

如果您要特别询问编译器在Lambda中声明变量时如何捕获变量,那么this是有用的资源。在该页面上:

  

将捕获列表添加到lambda时,编译器会将适当的成员变量添加到lambda-functor类以及用于初始化这些变量的构造函数。enter image description here

答案 1 :(得分:0)

  

否,我不知道如何使用它,但是我想了解如何使用Lamda   启用对capure子句的访问。什么是等效的   在C ++ 03中?如何使用静态回调重写lamda   功能? – selbolder

boost bind

还有here