std::move of std::packaged_task<void()> 不编译 (vs2013)

std::move of std::packaged_task<void()> does not compile (vs2013)

std::move doe 在移动 std::packaged_task<void()> 对象时无法编译。

错误是:

错误 C2182:“_Get_value”:非法使用类型 'void'
错误 C2182:“_Val”:非法使用类型 'void'
错误 C2182:“_Val”:非法使用类型 'void' 错误 C2665:'std::forward':2 个重载中的 none 可以转换所有参数类型
错误 C2512:'std::_Promise':没有合适的默认构造函数可用

密码是:

struct CalcFib
{
    int m_num;
    int m_res;
    CalcFib(int number) :m_num(number)
    {

    }

    CalcFib() :m_num(0)
    {

    }

    void  operator()()
    {
        m_res = fib(m_num);
    }

    int fib(int num)
    {
        if (num < 2) return num;
        else return fib(num - 1) + fib(num - 2);
    }

};

std::packaged_task<void()> task(std::move(CalcFib(30)));

std::packaged_task<void()> task1 = std::move(task);

这段代码编译成功:

struct CalcFib
{
    int m_num;
    int m_res;
    CalcFib(int number) :m_num(number)
    {

    }

    CalcFib() :m_num(0)
    {

    }

    int  operator()()
    {
        m_res = fib(m_num);
        return m_res;
    }

    int fib(int num)
    {
        if (num < 2) return num;
        else return fib(num - 1) + fib(num - 2);
    }

};

std::packaged_task<int()> task(std::move(CalcFib(30)));

std::packaged_task<int()> task1 = std::move(task);

similar issue was asked here but has not answer

这是 visual studio 编译器错误,我通过实施 packaged_task here

找到了一个很好的解决方案