gpt4 book ai didi

c++ - 将虚拟复制构造函数添加到 std::packaged_task

转载 作者:行者123 更新时间:2023-11-28 05:28:45 31 4
gpt4 key购买 nike

我试图绕过 std::packaged_task 缺少复制构造函数的问题,以便我可以将它传递给 std::function(它只会被移动)。

我继承自 std::packaged_task 并添加了一个虚拟复制构造函数,我认为如果我从不复制它移入的 std::function 则不应调用它。

#include <iostream>
#include <future>
#include <functional>
#include <thread>

template <typename T>
class MyPackagedTask : public std::packaged_task<T()> {
public:
template <typename F>
explicit MyPackagedTask(F&& f)
: std::packaged_task<T()>(std::forward<F>(f)) {}

MyPackagedTask(MyPackagedTask&& other)
: std::packaged_task<T()>(std::move(other)) {}

MyPackagedTask(const MyPackagedTask& other) {
// Adding this borks the compile
}
};

int main()
{
MyPackagedTask<int> task([]() {return 0;});
auto future = task.get_future();
std::thread t(std::move(task));
t.join();

std::cout << future.get() << std::endl;
}

用 gcc 6.2.1 编译它我收到以下错误消息(只是结束部分,如果你想要整个事情,请告诉我......):

/usr/include/c++/6.2.1/future:1325:6: error: invalid use of void expression
(*_M_result)->_M_set((*_M_fn)());

错误消息对我来说是无法解析的,所以我想知道是我做错了什么还是编译器失败了。

最佳答案

移动构造函数定义不正确,转发std::packaged_task<T()>&&作为MyPackagedTask&&这会调用错误的 std::packaged_task<T()> 构造函数.这是您观察到的编译器错误的原因。

正确的是:

MyPackagedTask(MyPackagedTask&& other)
: std::packaged_task<T()>(static_cast<std::packaged_task<T()>&&>(other))
{}

在那里static_cast<std::packaged_task<T()>&&>(other)向上转换到基类和 std::move .

关于c++ - 将虚拟复制构造函数添加到 std::packaged_task,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39996132/

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