Visual Studio中的std :: packaged_task错误?

时间:2014-11-04 10:58:28

标签: c++ visual-studio c++11

如果参数类型在Visual Studio(2012,2013,2013年11月CTP)中返回std::packaged_task,我发现std::vector无法推送到void。例如,

typedef std::packaged_task<void()> packaged_task;

std::vector<packaged_task> tasks;
packaged_task package;
tasks.push_back(std::move(package));

错误消息是:

error C2182: '_Get_value' : illegal use of type 'void'
error C2182: '_Val' : illegal use of type 'void'
error C2182: '_Val' : illegal use of type 'void'
error C2512: 'std::_Promise<int>' : no appropriate default constructor available
error C2665: 'std::forward' : none of the 2 overloads could convert all the argument types

我认为这是错误,因为此代码段可用于

  1. 返回类型不是void
  2. 它是在XCode中编译的。
  3. Visual Studio中是否有解决方案或其他选项?我知道可以用boost代替它。

1 个答案:

答案 0 :(得分:4)

我可以使用简单的auto m = std::move(package);重现这一点。

int main()
{
    typedef std::packaged_task<void()> packagedtask;
    packagedtask p1;
    packagedtask p2;
    p2 = std::move(p1); // does not cause the error
    auto p3 = std::move(p2); // causes the error
}

遍历代码,packaged_task嵌入了typedef,如下所示;

typedef typename _P_arg_type<_Ret>::type _Ptype;
typedef _Promise<_Ptype> _MyPromiseType;
当返回类型为_P_arg_type时,

void提供非void类型。 packaged_task移动构造函数包含对_Promise的内部_Promise<_Ret>的引用;

_MyPromise(_STD forward<_Promise<_Ret> >(_Other._MyPromise))

然后变为_Promise<void>,这又生成了无效的代码,生成了所看到的错误列表。应该是;

_MyPromise(_STD forward<_MyPromiseType >(_Other._MyPromise))
// possibly even using a move

正如移动赋值运算符所做的那样。

作为一种解决方法,请考虑添加&#34;虚拟&#34;或&#34;无法使用&#34;返回某种类型;

struct unusable {};

或者只是简单地按照您已经建议的int或提升。