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

ksl*_*ksl 1 c++ lambda copy-constructor c++11

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

lambda表达式按值而不是通过引用捕获变量,否则messagefoo退出时会破坏局部变量.

我不明白的是捕获m_impl.如果Impl删除了复制文件,如何通过值捕获?请有人开导我吗?

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

handleMessage 声明为:

void handleMessage(std::shared_ptr<std::string> message)
Run Code Online (Sandbox Code Playgroud)

m_impl作为:

std::unique_ptr<Impl> m_impl;
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*our 7

可以捕获的东西是:

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

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

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

  • @ksl:`this`总是被值捕获.但它是一个指针,因此按值捕获它与通过引用捕获对象的成员变量具有类似的效果.除了指针的值之外没有任何东西被复制. (4认同)