C++ 假装打包的_任务是可复制构造的

C++ 假装打包的_任务是可复制构造的,c++,c++11,asynchronous,C++,C++11,Asynchronous,我一直在寻找解决问题的办法 我想做的事情是这样的: #include <future> #include <functional> #include <iostream> namespace { std::function<void()> task; std::future<int> make(int val) { auto test = std::packaged_task<int()>([val](){

我一直在寻找解决问题的办法

我想做的事情是这样的:

#include <future>
#include <functional>
#include <iostream>

namespace {
  std::function<void()> task;
  std::future<int> make(int val) {
    auto test = std::packaged_task<int()>([val](){
      return val;
    });

    auto fut = test.get_future();
    task = std::move(test);
    return fut;
  }
}

int main() {
   auto fut = make(100);
   task();
   std::cout << fut.get() << "\n";
}
这个“对我有用”,但这真的是正确的代码吗?有没有更好的方法达到同样的净效果


(请注意,第二个示例中的
std::shared_ptr
的寿命对于我的真实代码很重要。很明显,我将采取措施防止调用相同的
std::函数两次)。

您的问题似乎源于类型不稳定性:

std::function<void()> task;  // Notice this is not a package_task
std::function任务
是经过深思熟虑的,不是一个bug-它是为了在
std::packaged_任务
中键入擦除操作符()。我希望它能够工作,因为隐式转换可以工作,而它在原始版本中不工作的唯一原因是删除了
std::packaged_task
的复制构造函数。
std::function<void()> task;  // Notice this is not a package_task
task = std::move(test);  // when test is `std::packaged_task<int()>`
namespace {

  std::packaged_task<int()> task;          // Change this.

  std::future<int> make(int val) {
    auto test = std::packaged_task<int()>([val](){
      return val;
    });

    auto fut = test.get_future();
    task = std::move(test);              // This now compiles.
    return fut;
  }
}
namespace {

    std::packaged_task<int()> task;

    std::future<int> make(int val) {
        std::packaged_task<int()> test([val](){return val;});

        auto fut = test.get_future();
        task     = std::move(test);
        return fut;
    }
}