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&lt;_Ret&gt;

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

然后这变成_Promise&lt;void&gt;,这又会生成更多无效代码,从而生成所见错误列表。应该是这样的;

_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 中的小程序慢得多

Visual Studio 宏

visual studio 2010中调用另外一个项目中的方法

visual studio 2005 图像上 添加 数字