Visual Studio 中的 std::packaged_task 错误?
Posted
技术标签:
【中文标题】Visual Studio 中的 std::packaged_task 错误?【英文标题】:std::packaged_task bug in Visual Studio? 【发布时间】:2014-11-04 10:58:28 【问题描述】:我发现如果参数类型在 Visual Studio(2012 年、2013 年、2013 年 11 月 CTP)中返回 void
,则无法将 std::packaged_task
推入 std::vector
。例如,
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
我认为这是错误,因为如果此代码 sn-p 有效
-
返回类型不是
void
,
它是在 XCode 中编译的。
Visual Studio 中是否有解决方案或其他选项?我知道 boost 可以用来代替这个。
【问题讨论】:
解决方法:为什么不使用 emplace_back 我可以用一个简单的auto m = std::move(package);
重现这个。我怀疑这是一个 MSVC 错误。
【参考方案1】:
我可以用一个简单的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
正如移动赋值运算符所做的那样。
作为一种解决方法,考虑添加某种“虚拟”或“不可用”返回类型;
struct unusable ;
或者只是一个int
或你已经建议的提升。
【讨论】:
谢谢,介绍一个假人是个好主意。以上是关于Visual Studio 中的 std::packaged_task 错误?的主要内容,如果未能解决你的问题,请参考以下文章
visual studio C/C++ 编程学习 visual studio 中的生成事件
Visual Studio中的环境变量(以Visual Studio 2013为例)
Visual Studio 2012 与 Visual Studio 2005 中的小程序慢得多