【问题标题】:Lambda capture by value and non copyable objectLambda 按值和不可复制对象捕获
【发布时间】:2015-04-14 08:20:59
【问题描述】:

我试图理解下面代码 sn-p 中 lambda 表达式的含义。

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

我不明白的是m_impl的捕获。如果Impl的copy 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 删除了其复制构造函数和赋值运算符。

【问题讨论】:

  • 我完全不确定,但我的猜测是它会被移动而不是复制,所以 m_impl 的原始“副本”在创建 lambda 后无效
  • 按价值捕获的是this,而不是您怀疑的m_implm_impl 通过隐式 this 指针间接访问

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


【解决方案1】:

可以捕获的东西有:

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

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

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

【讨论】:

  • m_impl 是一个成员变量。你是说this 是通过引用捕获的,即使捕获子句是[=]? 'Foo' 也有一个已删除的复制 ctor。
  • @ksl: this 总是按值捕获。但它是一个指针,所以按值捕获它与按引用捕获对象的成员变量的效果相似。除了指针的值之外,没有任何内容被复制。
  • 感谢@Mike Seymour。
猜你喜欢
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
相关资源
最近更新 更多