繁体   English   中英

即使我通过移动语义传递给 lambda 捕获,但它仍然尝试使用复制构造函数进行构造 | C++

[英]even though i passed to lambda capture through move semantic, but it still try construct with copy constructor | 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易于使用,它是可复制的。

因此,我们放入std::function的所有可调用 object 都必须是可复制的,即使我们从未实际复制 lambda。

这种情况下的解决方案是不使用std::function ,如下所示:

auto newTask = [promise = std::move(promise), task = std::move(task)]() mutable
{

}

使用此代码, auto将推断 lambda 的实际类型。 对于 msvc,该类型在内部拼写为lambda_9f392fbd7670777c18dfd2efbf01c5ca 请注意,您不能在代码中拼写该类型,只能拼写它的别名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM