我遇到了以下代码段的问题:
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)
提前致谢!
答案 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
。