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



移动std::packaged_task<void()>对象时std::move doe不编译

错误如下:

错误C2182: '_Get_value':非法使用'void'类型
错误C2182: '_Val':非法使用'void'类型
错误C2182: '_Val':非法使用'void'类型std::forward: 2个重载都不能转换所有参数类型
错误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);

这里也问过类似的问题,但没有回答

这是visual studio编译器的bug,我找到了一个很好的解决方案,通过在这里实现packaged_task

最新更新