移动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