首页 >后端开发 >C++ >我可以从移动捕获 Lambda 表达式创建'std::function”吗?

我可以从移动捕获 Lambda 表达式创建'std::function”吗?

Barbara Streisand
Barbara Streisand原创
2024-12-11 13:46:11976浏览

Can I Create an `std::function` from a Move-Capturing Lambda Expression?

从移动捕获 Lambda 表达式创建 std::function

可以从移动捕获 Lambda 表达式构造 std::function ;

模板构造函数

可以使用以下模板构造函数从移动捕获 lambda 构造 std::function:

template<class F>
function(F f);

要求

对于这个构造函数要工作,必须满足以下要求:

  • lambda 表达式的捕获必须是可复制构造的。
  • lambda 表达式必须是可调用的,具有指定的参数类型和返回类型。
  • lambda 捕获的复制构造函数和析构函数不得抛出异常

仅移动类型

不可能可以从移动的 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn