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

blA*_*s1N 8 c++ lambda c++11 std-function

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

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

son*_*yao 5

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

类型要求

您可以将 lambda 包装成std::reference_wrapperlike std::function<void()> b = std::ref(a);,但是您必须小心 lambda 对象的生命周期。或者您可以尝试停止使用std::function并直接使用 lambda;尤其是在模板上下文中。