std::packaged_task<R(Args...)>::packaged_task
来自cppreference.com
<tbody>
</tbody>
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::decay<F>::type 类型任务和共享状态的 std::packaged_task 对象,以 std::forward<F>(f) 初始化任务并存储。
|
这些重载只有在 设 |
(C++20 前) |
|
此重载只有在 如果 |
(C++20 起) |
3) 用分配器
a 分配存储任务所需的内存。4) 复制构造函数被弃置,
std::packaged_task 只能移动。5) 以
rhs 之前所占有的共享状态和任务构造 std::packaged_task,令 rhs 留在无共享状态且拥有被移动后的任务的状态。参数
| f | - | 要执行的可调用目标 |
| a | - | 存储任务时所用的分配器 |
| rhs | - | 要从之移动的 std::packaged_task
|
异常
2)
f 的复制/移动构造函数所抛的任何异常,在内存分配失败时可能是 std::bad_alloc。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
|
| LWG 2097 | C++11 | 对于重载 (2,3),F 可以是 std::packaged_task<R(Args...)>
|
对 F 进行约束
|
| LWG 4154 | C++11 | 重载 (2,3) 未考虑退化 | 考虑退化 |