Lambda 按值捕获和不可复制的对象
Lambda capture by value and non copyable object
我试图理解以下代码片段中 lambda 表达式的含义。
lambda 表达式通过值而不是引用捕获变量,否则局部变量 message
在 foo
退出时被销毁。
我不明白的是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
是一个成员变量,所以这就是这里发生的事情。
我试图理解以下代码片段中 lambda 表达式的含义。
lambda 表达式通过值而不是引用捕获变量,否则局部变量 message
在 foo
退出时被销毁。
我不明白的是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
是一个成员变量,所以这就是这里发生的事情。