尝试从移动捕获 Lambda 表达式创建 std::function 时可能会遇到困难,尽管创建 lambda 本身没有任何问题。这是由于 std::function 构造函数及其赋值运算符施加的限制。
std::function 构造函数和运算符= 要求参数是可复制构造的。但是,捕获仅移动类型(例如 std::unique_ptr)的移动捕获 lambda 不能是可复制构造的。
澄清一下,移动捕获是指 lambda 表达式使用的捕获机制。与复制捕获(创建捕获变量的副本)相反,移动捕获将变量的所有权转移给 lambda。
您提供的代码说明了该问题:
auto pi = std::make_unique<int>(0); auto foo = [q = std::move(pi)] { *q = 5; std::cout << *q << std::endl; }; std::function<void()> bar = foo; // Error: attempts to copy-construct 'foo'
lambda 表达式 'foo' 通过 move 捕获唯一指针 'pi',使其成为仅移动类型。因此,从 'foo' 构造 std::function 是不可能的,因为 'foo' 无法复制。
要规避此限制,请考虑其他方法,例如使用 std::bind 或创建包装类它封装了 lambda 并提供了 CopyConstructible 接口。
以上是为什么我无法从移动捕获 Lambda 创建 std::function?的详细内容。更多信息请关注PHP中文网其他相关文章!