Lambda 按值捕获和不可复制的对象

Lambda capture by value and non copyable object

我试图理解以下代码片段中 lambda 表达式的含义。

lambda 表达式通过值而不是引用捕获变量,否则局部变量 messagefoo 退出时被销毁。

我不明白的是m_impl的捕获。如果 Impl 的复制 ctor 被删除,它是如何被值捕获的?请问有人能赐教吗?

void Foo::foo(std::shared_ptr<std::string> message)
{
    m_impl->m_thread.send([=] { m_impl->handleMessage(message); });
}

handleMessage 声明为:

void handleMessage(std::shared_ptr<std::string> message)

m_impl为:

std::unique_ptr<Impl> m_impl;

Impl 已删除其复制构造函数和赋值运算符。

可以捕获的东西有:

  • 局部变量,按值或引用;
  • 在 class 成员函数中,this 指针,按值。

不捕获成员变量,尽管捕获 this 有效地通过引用捕获了它们。通过指定捕获默认值,如果您在 lambda 主体中引用任何 class 成员,将捕获 this,从而允许访问该成员。

据推测,m_impl是一个成员变量,所以这就是这里发生的事情。