c++ std function 要求参数有 copy constructor
2022年8月10日
std::function 默认对参数进行 copy
在写线程池的时候碰到了这样的报错信息:
1 | error: use of deleted function ‘std::packaged_task<_Res(_ArgTypes ...)>::packaged_task(const std::packaged_task<_Res(_ArgTypes ...)>&) [with _Res = void; _ArgTypes = {}]’ |
也就是说我的代码里调用了 packaged_task 的 copy 构造函数,但是它实际上是被删除了,因此导致编译错误;那么哪里会调用 packaged_task 的 copy 构造呢
1 | class ThreadPool { |
可以看到 _task_queue 的类型是 std::queue<std::function<void()>>
,而 std::function
会对传入的参数调用 copy 构造函数,所以它的参数必须是可拷贝的(copy constructible)cppreference;然而 packaged_task 不能被 copy 只能被 move,所以会报错;
修改方式就是把 std::queue<std::function<void()>>
改成 std::queue<std::packaged_task<void()>>
就可以了;