在将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&);
是,std::function
要求功能对象为std::function
,并且不能与仅移动功能对象一起使用。
类型要求
- [CopyConstructible必须满足
F
和Callable的要求。
您可以像CopyConstructible一样将lambda包装到std::reference_wrapper
中,但随后必须注意lambda对象的生存期。或者您可以尝试停止使用std::reference_wrapper
并直接使用lambda;特别是在模板上下文中。