如何修复错误'std::promise<int>::promise(const std::promise<int> &)':尝试引用已删除的函数

How to fix error 'std::promise<int>::promise(const std::promise<int> &)' : attempting to reference a deleted function

本文关键字:promise lt gt int std 引用 函数 删除 错误 何修复 const      更新时间:2023-10-16

我试图理解'未来'、'承诺'和'异步'。 所以我几乎逐字复制了以下代码 cppreference.com. 编译器给出错误std::promise<int>::promise(const std::promise<int> &):尝试引用已删除的函数。

#include "stdafx.h"
#include <iostream>
#include <future>
#include <thread>
int main()
{
  // future from a packaged_task
  std::packaged_task<int()> task([](){ return 7; }); // wrap the function
  std::future<int> f1 = task.get_future();  // get a future
  std::thread(std::move(task)).detach(); // launch on a thread
// future from an async()
  std::future<int> f2 = std::async(std::launch::async, [](){ return 8; });
// future from a promise
  std::promise<int> p;
  std::future<int> f3 = p.get_future();
  std::thread( [](std::promise<int> p){ p.set_value_at_thread_exit(9); }, //<-- error occurs here
             std::move(p) ).detach();
  std::cout << "Waiting..." << std::flush;
  f1.wait();
  f2.wait();
  f3.wait();
  std::cout << "Done!nResults are: "
            << f1.get() << ' ' << f2.get() << ' ' << f3.get() << 'n';
}

我明白为什么,由于复制构造函数,无法复制"承诺"p。 但是由于这不是我的班级,所以我无法更改它。 所以我的问题是:

1)这是一个来自C++参考网站的示例,它是否可以在任何其他编译器上编译?(我正在使用VS 2013)。

2)我该怎么做才能修复错误并使示例按预期工作?

注意:我在下面回答了我自己的问题。 但是现在示例程序在

...
f3.wait();

因此,尽管我的更改允许它编译,但现在我遇到了运行时错误。 那是由于我的改变吗? 还是另一个错误? 错误是"调试错误!...R6010 - abort() 已被调用"。

注意:我在下面修改了我的答案。 我决定使用指针而不是引用。

对不起,我刚刚想通了。 我更改了函数以传递指针,如下所示...

std::thread( [](std::promise<int>* p){ p->set_value_at_thread_exit(9); }, //<-- pointer fixes error
         &p).detach();

我尝试使用参考。 这修复了原始错误,但随后我遇到了失败的调试断言"调试错误!...R6010 - abort() 已被调用"。 在调试时,我发现 promise 析构函数是在 promise 任务完成后但在调用 F3.wait() 之前

调用的。

所以,这回答了问题#2。 我认为问题#1的答案是否定的。 我会让视线知道这个错误(如果可以的话会编辑它)。