捕获参数是从右值lambda中复制的吗?

8
在将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&);

2
可能是重复问题:[如何从移动捕获的lambda表达式创建std :: function?](https://dev59.com/HV8e5IYBdhLWcg3wucf-) - cpplearner
1个回答

5

是的,std::function 要求函数对象为可复制的,不能与“仅移动”(move-only)函数对象一起使用。

类型要求

你可以将lambda包装到std::reference_wrapper中,如 std::function<void()> b = std::ref(a);,但之后你必须注意lambda对象的生命周期。或者在模板上下文中停止使用std::function,直接使用lambda表达式。


首先感谢您的回答。但是我没有找到一个能解决我的问题的答案。因为我想要做的是将一个参数绑定到一个函数并将该函数存储在队列中。有没有其他方法可以解决我的问题? - user12604069
1
@blAs1N:你需要编写类似于std::function的东西,但只需要可移动性。这是一个太大的任务,不适合在Stack Overflow上进行问答。 - Nicol Bolas
1
另一种解决方案是编写一个可调用的包装器,用于 shared_ptr<Foo> - Brian Bi
@NicolBolas 或许这不是_那么_大的任务?https://dev59.com/B18e5IYBdhLWcg3w0dJJ。 - cpplearner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接