std::packaged_task<R(Args...)>::packaged_task
来自cppreference.com
< 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::forward<F>(f) 初始化副本。用分配器 a 分配存储任务所需的内存。 (C++17 前)
- 如果 std::decay<F>::type 与 std::packaged_task<R(ArgTypes...)> 是同一类型,那么这些 (C++17 前)此 (C++17 起)构造函数不参与重载决议。
- 如果 INVOKE<R>(std::forward<F>(f), std::declval<Args>()...) 在作为不求值操作数时非良构(即 std::is_invocable_r_v<R, F, Args...> 不是 true) (C++17 起),那么程序非良构。
- 如果在 f 的副本上的调用与在 f 上的调用的行为不同,那么行为未定义。
4) 复制构造函数被删除,
std::packaged_task
只能移动。5) 以 rhs 之前所占有的共享状态和任务构造
std::packaged_task
,令 rhs 留在无共享状态且拥有被移动后的任务的状态。参数
f | - | 要执行的可调用目标(函数、成员函数、lambda 表达式、函数对象) |
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 << "开始任务\n"; auto result = fib_task.get_future(); std::thread t(std::move(fib_task), 42); std::cout << "等待任务结束..." << std::endl; std::cout << result.get() << '\n'; std::cout << "任务完成\n"; t.join(); }
输出:
开始任务 等待任务结束... 267914296 任务完成
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2067 | C++11 | 复制构造函数的参数类型是 packaged_task&
|
添加 const |