gpt4 book ai didi

c++ - Visual Studio 中的 std::packaged_task 错误?

转载 作者:搜寻专家 更新时间:2023-10-31 01:02:43 25 4
gpt4 key购买 nike

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

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 中编译的。

Visual Studio 中是否有解决方案或其他选项?我知道 boost 可以用来代替它。

最佳答案

我可以用一个简单的 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 时提供非空类型. 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或按照您的建议进行提升。

关于c++ - Visual Studio 中的 std::packaged_task 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26733430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com