无法将std::bind的结果转换为std::函数

Cannot convert result of std::bind to std::function

本文关键字:std 转换 函数 结果 bind      更新时间:2023-10-16

我在下面的代码片段中遇到了麻烦:

std::promise<int> promise;    
auto operation = [](std::promise<int> promise) { promise.set_value(1); };
auto fn = std::bind(operation, std::move(promise));
fn();

使用clang得到以下错误:

候选模板被忽略:替换失败[with _Args = <>]:隐式实例化未定义模板'std::__1::__bind_return<(lambda at promise.cpp:7:12),Std::__1::tuple>, Std::__1::tuple<>, false>'操作符()(_Args&和;…__args)

提前感谢!

绑定对象作为左值传递,并且不能复制promise

让你的lambda接受左值引用将使你的代码编译,但可能不是一个好主意。

auto operation = [](std::promise<int>& promise) { promise.set_value(1); };
//                                   ^

Igor是非常正确的,但对于我的目的,这工作得很好,并且是c++11兼容:

std::promise<int> promise;    
auto operation = [](std::promise<int>& promise) { promise.set_value(1); };
std::packaged_task<void ()> fn { std::bind(operation, std::move(promise)) };
fn();

通过将operation更改为对std::promise的引用而不是值,并使用可移动且不可复制的std::packaged_task,我可以实现具有可以传递的函数的原始目标,该函数保存std::promise