C++ 我应该如何正确地将打包的任务移动到lambda?

C++ 我应该如何正确地将打包的任务移动到lambda?,c++,lambda,move-semantics,packaged-task,C++,Lambda,Move Semantics,Packaged Task,我一直试图将打包的任务捕获到lambda中,但失败了 我完全理解移动语义学,也读过一些现代文学,我想我没有错过任何东西。我还阅读了Josuttis的移动语义书,以及关于广义lambda捕获和类似案例的ISO主题,位于 我有下一个代码: #include <thread> #include <vector> #include <functional> #include <queue> #include <condition_variable&g

我一直试图将打包的任务捕获到lambda中,但失败了
我完全理解移动语义学,也读过一些现代文学,我想我没有错过任何东西。我还阅读了Josuttis的移动语义书,以及关于广义lambda捕获和类似案例的ISO主题,位于
我有下一个代码:

#include <thread>
#include <vector>
#include <functional>
#include <queue>
#include <condition_variable>
#include <mutex>
#include <future>
#include <type_traits>
#include <iostream>

// #include's for below code and other purposes

int main() {
    auto f = []() { return 1; }; 
    std::queue<std::function<void()>> q;
    std::packaged_task<int()> pack(f);
    q.emplace([p = std::move(pack)] () mutable { p(); });

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
//#包括用于以下代码和其他目的的
int main(){
自动f=[](){return 1;};
std::队列q;
标准:打包的任务包(f);
q、 安放([p=std::move(pack)]()可变{p();});
返回0;
}
在这里,我创建了一个简单的函数队列,其中包含一些“void()”和打包的_任务,并传递“int”返回类型的“f”。
然后,我尝试将打包的_任务移动到lambda中,以便稍后在其他线程中使用它(我需要在其他线程中使用它,它将在更晚的时候执行它,此时“pack”将被销毁,这就是为什么我不能引用它的原因)
看起来一切都很好,但当我使用“g++main.cpp-o main-std=c++14”(甚至使用c++17)编译它时,g++告诉我:

/usr/include/c++/9/bits/std_function.h:176:6:错误:使用已删除的函数“main()::(const main()::&)”
176 |新的_函子(*_源._M_访问())
|^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ main.cpp:19:32:注意:'main()::(const main():::&')被隐式删除,因为默认定义的格式不正确:
19 | q.位置([p=std::move(pack)]()可变{p();})
|^
main.cpp:19:32:错误:使用已删除的函数“std::packaged_task::packaged_task(const std::packaged_task&)[with _Res=int;_ArgTypes={}]
在main.cpp中包含的文件中:8:
/usr/include/c++/9/future:1511:7:注意:此处声明
1511 |打包任务(const packaged_task&)=删除
|^~~~~~~~~~~~~

我也可以使用shared_ptr通过将副本传递给lambda来解决这个问题,但这种解决问题的方法似乎太难看了。
那么,如果我试图移动它,为什么我会在复制构造时出错?我该如何修复它呢

你的lambda很好。如果将lambda定义移动到它自己的行,您将发现其中没有错误

您的问题在于,由于lambda包含一个仅移动的对象,因此它不可复制

你可以尝试,或者尝试以不同的方式处理你的问题