Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将不可移动和不可复制的函数返回值获取到数组中 我一直在尝试使用C++协同例程来实现一个协作的作业调度程序。这涉及到将co例程放入数组中。但是,当我尝试执行此操作时,无法分配类型为“Job”的错误对象,因为其复制分配运算符被隐式删除。我不完全理解下面的代码,但我的印象是,我不能仅仅使工作可移动/可复制_C++_C++20 - Fatal编程技术网

如何将不可移动和不可复制的函数返回值获取到数组中 我一直在尝试使用C++协同例程来实现一个协作的作业调度程序。这涉及到将co例程放入数组中。但是,当我尝试执行此操作时,无法分配类型为“Job”的错误对象,因为其复制分配运算符被隐式删除。我不完全理解下面的代码,但我的印象是,我不能仅仅使工作可移动/可复制

如何将不可移动和不可复制的函数返回值获取到数组中 我一直在尝试使用C++协同例程来实现一个协作的作业调度程序。这涉及到将co例程放入数组中。但是,当我尝试执行此操作时,无法分配类型为“Job”的错误对象,因为其复制分配运算符被隐式删除。我不完全理解下面的代码,但我的印象是,我不能仅仅使工作可移动/可复制,c++,c++20,C++,C++20,约伯 资料来源: 我尝试了以下方法: 传递指向作业的指针,但会遇到对象生存期问题,因为如果在函数中的堆栈上创建了该指针,并且函数退出,则会留下一个悬空指针 忽略非移动能力并强制它,会导致错误并调用UB ,但由于co例程语义的原因,我无法创建放置新操作符 编辑1:添加了co_返回 如何将不可移动和不可复制的函数返回值获取到数组中 Job jobList[2048]; obList[0] = testCoro(); 没有办法指定不可移动的类型。将此类对象放入数组的唯一方法是直接初始化数组元素。

约伯

资料来源:

我尝试了以下方法:

  • 传递指向作业的指针,但会遇到对象生存期问题,因为如果在函数中的堆栈上创建了该指针,并且函数退出,则会留下一个悬空指针
  • 忽略非移动能力并强制它,会导致错误并调用UB
  • ,但由于co例程语义的原因,我无法创建放置新操作符
编辑1:添加了co_返回

如何将不可移动和不可复制的函数返回值获取到数组中

Job jobList[2048];
obList[0] = testCoro();
没有办法指定不可移动的类型。将此类对象放入数组的唯一方法是直接初始化数组元素。例如:

Job jobList[] {testCoro()};
如果这不是一个选项,则不能使用不可移动对象的数组


另一种数据结构是一个定制容器,该容器具有不断调整大小的字符存储阵列,可与placement new一起重用,如链接问题中所示。现在还不清楚为什么“共同例程语义”会阻止这一点。

“我的印象是,我不能让工作可以移动/复制。”为什么不呢?这一切还能有什么用呢?我的意思是,如果你默认初始化一个,除非你能复制或移动到它里面,否则它怎么会成为一个可行的
作业
。您的设计似乎假设协同程序正在安排与调用者的恢复,这通常不是它的工作方式。@NicolBolas创建默认构造函数只是为了让我可以定义一个包含它们的数组,否则在
作业列表[2048]行上会有错误。我不知道如何使它成为一个可行的工作,这就是我为什么要问的原因。jobsystem有点像多线程,具有长时间运行的协同例程,定期让其他人运行(即,一个在进行路径查找计算,另一个在处理UI)。这是为了避免使用状态机。“co-routine语义”指的是co-routine函数必须如何返回一个可以用coroutine\u句柄构造的结构。因此,我不能使用placement new,因为它是一个函数返回值,有没有方法进行placement返回(因为我得到的是一个返回的对象,而不是创建一个新对象)。@Evalafontaine:“一个共同例程函数必须返回一个可以用一个共同例程句柄构造的结构。”是的,但是,
共同例程句柄
是可复制的。它是!出于某种原因,我假设句柄的位置有一些神奇的东西(好像它像一个互斥体或其他东西)。如果是这样的话,那么我可以取消删除作业中的构造函数。
Job jobList[2048];
obList[0] = testCoro();
Job jobList[] {testCoro()};