std::packaged_task<R(Args...)>::packaged_task
来自 cppreference.cn
< cpp | thread | packaged_task
packaged_task() noexcept; |
(1) | (C++11 起) |
template< class F > explicit packaged_task( F&& f ); |
(2) | (C++11 起) |
template< class F, class Allocator > explicit packaged_task( std::allocator_arg_t, const Allocator& a, F&& f ); |
(3) | (C++11 起) (C++17 前) |
packaged_task( const packaged_task& ) = delete; |
(4) | (C++11 起) |
packaged_task( packaged_task&& rhs ) noexcept; |
(5) | (C++11 起) |
构造一个新的 std::packaged_task
对象。
1) 构造一个没有任务也没有共享状态的
std::packaged_task
对象。2,3) 构造一个
std::packaged_task
对象,其存储任务类型为 std::decay<F>::type 且具有共享状态。存储任务通过 std::forward<F>(f) 初始化。
这些重载只有在 std::decay<F>::type 与 std::packaged_task<R(Args...)> 不是相同类型时才参与重载决议。 设 t1, t2, ..., tN 是 |
(C++20 前) |
此重载只有在 std::remove_cvref_t<F> 与 std::packaged_task<R(Args...)> 不是相同类型时才参与重载决议。 如果 std::is_invocable_r_v<R, std::decay_t<F>&, Args...> 为 false,则程序是病态的。 |
(C++20 起) |
3) 分配器 a 用于分配存储任务所需的内存。
4) 复制构造函数被删除,
std::packaged_task
仅支持移动。5) 构造一个
std::packaged_task
,其共享状态和任务由 rhs 先前拥有,而 rhs 则没有共享状态,并且其任务处于已移动状态。目录 |
[编辑] 参数
f | - | 要执行的可调用目标 |
a | - | 存储任务时使用的分配器 |
rhs | - | 从中移动的 std::packaged_task |
[编辑] 异常
3) 由 f 的复制/移动构造函数抛出的任何异常,以及如果内存分配失败,由分配器的
allocate
函数抛出的异常。[编辑] 示例
运行此代码
#include <future> #include <iostream> #include <thread> int fib(int n) { if (n < 3) return 1; else return fib(n - 1) + fib(n - 2); } int main() { std::packaged_task<int(int)> fib_task(&fib); std::cout << "Starting task\n"; auto result = fib_task.get_future(); std::thread t(std::move(fib_task), 42); std::cout << "Waiting for task to finish..." << std::endl; std::cout << result.get() << '\n'; std::cout << "Task complete\n"; t.join(); }
输出
Starting task Waiting for task to finish... 267914296 Task complete
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
LWG 2067 | C++11 | 复制构造函数的参数类型是 packaged_task& |
添加了 const |
LWG 2097 | C++11 | 对于重载 (2,3),F 可以是 std::packaged_task<R(Args...)> |
F 受约束 |
LWG 4154 | C++11 | 重载 (2,3) 未考虑衰变 | 考虑衰变 |