向std::packaged_task添加虚拟复制构造函数
Adding dummy copy constructor to std::packaged_task
我试图绕过std::packaged_task缺乏复制构造函数,以便我可以将其传递给std::函数(只会移动)。
我继承了std::packaged_task,并添加了一个虚拟复制构造函数,我认为如果我从不复制std::函数,它就不应该被调用。
#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)());
错误信息对我来说是不可解析的,所以我想知道我是否做错了什么,或者如果编译器失败。
move构造函数定义不正确,将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++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 冲突的 CLANG"虚拟 dtor"和"已弃用的复制运算符"警告
- 构造函数尝试调用复制构造函数,虚拟继承
- 虚拟继承、默认构造函数和额外复制
- 虚拟复制构造函数
- 如何在不中断移动和复制构造函数的情况下声明虚拟析构函数
- 为什么使用虚拟基类会更改复制构造函数的行为
- 当<T> T 没有复制构造函数时,std::queue 的虚拟包装器不会编译
- 纯虚拟方法使用C++中的复制构造函数返回类类型
- 向std::packaged_task添加虚拟复制构造函数
- 虚拟复制构造函数(克隆函数)的意义何在?
- 提供基类(或不可复制类)和虚拟继承的类型
- 使用复制构造函数和存在虚拟函数时出错"recursive on all control paths"
- C++虚拟基类:不调用父级的复制构造函数
- 复制省略和虚拟克隆