如何修复错误 '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'。我会让视线知道这个错误(如果可以的话会编辑它)。
我正在尝试理解 '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'。我会让视线知道这个错误(如果可以的话会编辑它)。