【问题标题】:Cannot convert result of std::bind to std::function无法将 std::bind 的结果转换为 std::function
【发布时间】:2016-07-02 03:07:28
【问题描述】:

我遇到了以下 sn-p 的问题:

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, std::__1::tuple, false>' 运算符()(_Args&& ...__args)

提前致谢!

【问题讨论】:

  • 你想要移动捕捉。 std::bind 不能那样做。 Lambda can do it starting with C++14,但不在 C++11 中。
  • @IgorTandetnik std::bind 可以很好地进行移动捕获。问题是它将捕获的东西作为左值传递。
  • 您的标题具有误导性:您当前的代码中没有std::function

标签: c++ c++11


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 是的,遗憾的是,没有std::not_packaged_task 可以避免拥有std::promise 和相关共享状态的开销。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2014-12-11
    相关资源
    最近更新 更多