std::packaged_task<R(Args...)>:: packaged_task
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
|
packaged_task::packaged_task
|
||||
| Getting the result | ||||
| Execution | ||||
| Non-member functions | ||||
| Helper classes | ||||
|
(until C++17)
|
||||
| Deduction guides (C++17) |
|
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
对象。
std::packaged_task
对象。
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 起) |
std::packaged_task
仅支持移动操作。
std::packaged_task
,其共享状态和任务先前由
rhs
所拥有,使
rhs
不再具有共享状态且任务处于移出状态。
目录 |
参数
| f | - | 要执行的可调用目标 |
| a | - | 存储任务时使用的分配器 |
| rhs | - |
要从中移动的
std::packaged_task
|
异常
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) 未考虑退化 | 考虑退化 |