gpt4 book ai didi

c++ - 如何修复错误 'std::promise::promise(const std::promise &)' : attempting to reference a deleted function

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:50:59 25 4
gpt4 key购买 nike

我试图理解“ future ”、“ promise ”和“异步”。所以我几乎一字不差地从 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();

因此,虽然我的更改允许它编译,但现在我遇到了运行时错误。是因为我的改变吗?还是另一个错误?错误是“调试错误!... R6010 - 已调用 abort()”。

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

最佳答案

对不起,我刚刚弄明白了。我更改了函数以传递一个指针,如下所示...

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

我曾尝试使用引用。这修复了原始错误,但后来我遇到了一个失败的调试断言“调试错误!... R6010 - 中止()已被调用”。在调试时,我发现在 promise 任务完成之后但在调用 F3.wait() 之前调用了 promise 析构函数。

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

关于c++ - 如何修复错误 'std::promise<int>::promise(const std::promise<int> &)' : attempting to reference a deleted function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28946268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com