可以从移动捕获 Lambda 表达式构造 std::function ;
模板构造函数
可以使用以下模板构造函数从移动捕获 lambda 构造 std::function:
template<class F> function(F f);
要求
对于这个构造函数要工作,必须满足以下要求:
仅移动类型
不可能可以从移动的 lambda 构造 std::function捕获仅移动类型。这是因为 std::function 的复制构造函数和赋值运算符是根据需要可复制构造类型的构造函数定义的。
示例
考虑以下代码片段:
auto pi = std::make_unique<int>(0); // Move-capturing lambda auto foo = [q = std::move(pi)] { *q = 5; std::cout << *q << std::endl; };
尝试使用以下任何方法从此 lambda 创建 std::function 将导致出现编译错误:
std::function<void()> bar = foo; std::function<void()> bar{foo}; std::function<void()> bar{std::move(foo)}; std::function<void()> bar = std::move(foo); std::function<void()> bar{std::forward<std::function<void()>>(foo)}; std::function<void()> bar = std::forward<std::function<void()>>(foo);
这是因为 pi 是仅移动类型,而 std::function 的复制构造函数需要可复制构造的类型。
因此,如果您希望将移动捕获 lambda 与 std::function 结合使用,确保其捕获是可复制构造的。
以上是我可以从移动捕获 Lambda 表达式创建'std::function”吗?的详细内容。更多信息请关注PHP中文网其他相关文章!