Lambda按值捕获和非可复制对象

时间:2015-04-14 08:21:00

标签: c++ c++11 lambda copy-constructor

我试图在下面的代码片段中了解lambda表达式的含义。

lambda表达式按值而不是引用来捕获变量,否则当message退出时会破坏局部变量foo

我不明白的是对m_impl的捕获。如果Impl的副本被删除,它是如何通过值捕获的?请有人开导我吗?

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 as:

std::unique_ptr<Impl> m_impl;

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

1 个答案:

答案 0 :(得分:7)

可以捕获的东西是:

  • 局部变量,按值或参考;
  • 在类成员函数中,this指针,按值。

虽然捕获this通过引用有效捕获它们,但未捕获成员变量。通过指定捕获默认值,如果您引用lambda正文中的任何类成员,则将捕获this,允许访问该成员。

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