如何修复错误 '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

我正在尝试理解 'future'、'promise' 和 'async'。所以我几乎一字不差地从 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';
}

我知道为什么,'promise' p 由于复制构造函数而无法复制。但是因为它不是我的class,所以我不能改变它。所以我的问题是:

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

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

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

处的调试断言失败
f3.wait();

所以,虽然我的更改允许它编译,但现在我遇到了运行时错误。是因为我的改变吗?还是另一个错误?错误是 "Debug Error! ... R6010 - abort() has been called".

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

抱歉,我刚弄明白。我将函数更改为如下传递指针...

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

我试过使用参考。这修复了原始错误,但随后我 运行 变成了失败的调试断言 "Debug Error! ... R6010 - abort() has been called"。在调试时,我发现在 promise 任务完成之后但在调用 F3.wait() 之前调用了 promise 析构函数。

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