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

时间:2016-07-02 03:07:29

标签: c++ c++11

我遇到了以下代码段的问题:

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

使用clang我收到以下错误:

  忽略

候选模板:替换失败[使用_Args =&lt;&gt;]:         隐式实例化未定义模板&#st; :: __ 1 :: __ bind_return&lt;(lambda at promise.cpp:7:12),   std :: __ 1 :: tuple&gt;,std :: __ 1 :: tuple&lt;&gt ;, false&gt;&#39;           operator()(_ Args&amp;&amp; ...__ args)

提前致谢!

2 个答案:

答案 0 :(得分:1)

绑定对象作为左值传递,promise s无法复制。

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

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

答案 1 :(得分:0)

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