【问题标题】:Capture arguments are copied from rvalue lambda? [duplicate]捕获参数是从右值 lambda 复制的? [复制]
【发布时间】:2020-04-17 02:00:11
【问题描述】:

在将 lambda 转换为 std::function 期间是否复制了捕获的参数?
我需要将捕获不可复制类型的 lambda 转换为 std::function
所以我将一个 lambda 作为右值传递给std::function,但发生了错误。

// Foo is non-copyable.
auto a = [f = Foo()]{ };
std::function<void()> b = std::move(a) // error, calls deleted Foo::Foo(const Foo&);

【问题讨论】:

标签: c++ c++11 lambda std-function


【解决方案1】:

是的,std::function 要求函数对象为 CopyConstructible,并且不能与仅移动函数对象一起使用。

类型要求

您可以像std::function&lt;void()&gt; b = std::ref(a); 一样将 lambda 封装到 std::reference_wrapper 中,但是您必须注意 lambda 对象的生命周期。或者你可以尝试停止使用std::function,直接使用lambda;尤其是在模板上下文中。

【讨论】:

  • 首先感谢您的回答。但是我找不到可以解决我问题的答案之一。因为我想做的是将参数绑定到函数并将该函数存储在队列中。有没有其他方法可以解决我的问题?
  • @blAs1N:你必须写像std::function 这样的东西,但这只需要可移动性。对于 Stack Overflow Q&A 来说,这任务太大了。
  • 另一种解决方案是为shared_ptr&lt;Foo&gt;编写一个可调用的包装器。
  • @NicolBolas 也许这不是大任务? stackoverflow.com/questions/25330716/….
猜你喜欢
  • 2021-09-15
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
相关资源
最近更新 更多