如果参数类型在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
我认为这是错误,因为此代码段可用于
void
,Visual Studio中是否有解决方案或其他选项?我知道可以用boost代替它。
答案 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
或提升。