c++ - 即使我通过移动语义传递给 lambda 捕获,但它仍然尝试使用复制构造函数进行构造 | C++
问题描述
std::promise<int> promise{};
std::function<void()> newTask = [promise = std::move(promise), task = std::move(task)]() mutable
{
}
即使我通过 std::move(promise) 传递了变量,编译器仍然尝试使用复制构造函数制作 promise 变量。
message : 'ThreadPool::push_task::<lambda_9f392fbd7670777c18dfd2efbf01c5ca>::<lambda_9f392fbd7670777c18dfd2efbf01c5ca>(const ThreadPool::push_task::<lambda_9f392fbd7670777c18dfd2efbf01c5ca> &)': function was implicitly deleted because a data member invokes a deleted or inaccessible function 'std::promise<ReturnType>::promise(const std::promise<ReturnType> &)'
解决方案
如您所知,std::function
它不是 lambda,而是任何可调用类型(包括 lambda)的通用容器。
为了std::function
便于使用,它是可复制的。
因此,我们放在 a 中的所有可调用对象都std::function
必须是可复制的,即使我们从未实际复制 lambda。
在这种情况下,解决方案是不使用std::function
,如下所示:
auto newTask = [promise = std::move(promise), task = std::move(task)]() mutable
{
}
使用此代码auto
将推断出 lambda 的实际类型。对于 msvc,该类型在内部拼写为lambda_9f392fbd7670777c18dfd2efbf01c5ca
. 请注意,您不能在代码中拼写该类型,只能拼写它的别名。
推荐阅读
- javascript - 为什么我只能使用 .FILTER 删除本地存储的最后一项
- forms - 在表单字段中验证美国车牌号
- javascript - 在 js-react native 中访问 props 和 navigation
- neo4j - 从关系中删除冗余节点
- python - 我如何在不重新启动机器人的情况下停止这个不和谐的机器人命令?
- ruby-on-rails - 在 Ruby on Rails 的后台运行 after_update 回调
- java - 为什么 GraphicsEnvironment 是无头的?
- tensorflow - GradientTape 计算损失函数中的显着性
- c - 删除链表中的第一个节点或弹出队列
- angular - Angular中的绘图仅呈现第一个接收到的值