在 C 领域,构造 std::function 的任务来自移动捕获 lambda 表达式经常出现。虽然移动捕获 lambda 表达式本身可以无缝创建,但问题在于无法将它们封装在 std::function 中。
如我们的示例所示:
auto pi = std::make_unique<int>(0); auto foo = [q = std::move(pi)] { *q = 5; std::cout << *q << std::endl; };
这个示例毫不费力地构造一个移动捕获 lambda 表达式,不会遇到任何障碍。然而,当尝试在 std::function 中包含这个 lambda 时,我们遇到了一系列错误:
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);
深入研究 std::function 类的复杂性,我们发现以下构造函数:
template<class F> function(F f);
这个构造函数揭示了根本问题:它需要封装的函数 F 是可复制构造的。然而,我们的移动捕获 lambda 表达式不满足这个标准;相反,它会移动捕获一个不可复制构造的对象。
因此,我们得出的结论是,虽然从移动捕获 lambda 表达式构造 std::function 是可行的,但当 lambda 表达式移动捕获不可复制构造的对象。在这种情况下,需要替代方法,例如“release/acquire-in-lambda”习惯用法。
以上是为什么我无法从具有不可复制对象的移动捕获 Lambda 创建'std::function”?的详细内容。更多信息请关注PHP中文网其他相关文章!