我试图在下面的代码片段中了解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
删除了其复制构造函数和赋值运算符。
答案 0 :(得分:7)
可以捕获的东西是:
this
指针,按值。虽然捕获this
通过引用有效捕获它们,但未捕获成员变量。通过指定捕获默认值,如果您引用lambda正文中的任何类成员,则将捕获this
,允许访问该成员。
据推测,m_impl
是一个成员变量,所以这就是这里发生的事情。