我一直在尝试将 packaged_task 捕获到 lambda 中,但失败了。
\n我完全理解动作语义,也读过一些现代文学,我想我没有错过任何东西。我还阅读了 Josuttis 的移动语义书,以及关于广义 lambda 捕获的 ISO 主题以及ISO C++ 14 语言扩展
中的类似案例\n我有下一个代码:
#include <thread>\n#include <vector>\n#include <functional>\n#include <queue>\n#include <condition_variable>\n#include <mutex>\n#include <future>\n#include <type_traits>\n#include <iostream>\n\n// #include\'s for below code and other purposes\n\nint main() {\n auto f = []() { return 1; }; \n std::queue<std::function<void()>> q;\n std::packaged_task<int()> pack(f);\n q.emplace([p = std::move(pack)] () mutable { p(); });\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这里我创建了简单的函数队列,保存一些“void()”和packaged_task,传递“int”返回类型的“f”。
\n然后我尝试将 packaged_task 移动到 lambda 中以便稍后在其他线程中使用它(我需要在其他线程中使用它,这将在稍后执行它,当“pack”将被销毁时,这就是为什么我不能引用它)
\n看起来一切都很好,但是当我用“g++ main.cpp -o main -std=c++14”(甚至使用c++17)编译它时, g++ 告诉我这个:
\n/usr/include/c++/9/bits/std_function.h:176:6: 错误:使用已删除的函数 \xe2\x80\x98main()::::(const main()::&)\xe2\x80 …