std::packaged_task<R(Args...)>::packaged_task
From 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::decay<F>::type 型のタスクと共有状態を格納する
std::packaged_taskオブジェクトを構築します。格納されるタスクは std::forward<F>(f) によって初期化されます。|
これらのオーバーロードは、std::decay<F>::type が std::packaged_task<R(Args...)> と同じ型でない場合にのみ、オーバーロード解決に参加します。
|
(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) rhs が以前所有していた共有状態とタスクで
std::packaged_taskを構築します。これにより、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++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| 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) はデケイを考慮していませんでした。 | デケイを考慮します。 |