如何修复错误'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
我试图理解'未来'、'承诺'和'异步'。 所以我几乎逐字复制了以下代码 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的答案是否定的。 我会让视线知道这个错误(如果可以的话会编辑它)。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 有可能在信号处理程序中设置promise吗
- std::future可以比std::promise活得更长吗
- 如何显式调用运算符<<
- 包装器返回promise c++
- coroutine_handle<Promise>::from_promise() 在C++中的工作原理
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- 如何在 c++ 中使用 future 和 promise 从函数线程中获取返回值
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 在设置值之前,必须调用Promise.get_future()
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- STD :: Promise Set_exception两次导致分段故障