名前空間
変種
操作

std::packaged_task<R(Args...)>::packaged_task

提供: cppreference.com
 
 
スレッドサポートライブラリ
スレッド
(C++11)
(C++20)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
相互排他
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
フューチャー
(C++11)
(C++11)
(C++11)
(C++11)
 
 
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) std::forward<F>(f) で初期化されたタスクのコピーと共有状態を持つ std::packaged_task オブジェクトを構築します。 このコンストラクタは、 std::decay<F>::typestd::packaged_task<R(ArgTypes...)> と同じ型の場合、オーバーロード解決に参加しません。
3) std::forward<F>(f) で初期化されたタスクのコピーと共有状態を持つ std::packaged_task オブジェクトを構築します。 タスクを格納するために必要なメモリ確保のために、指定されたアロケータを使用します。 このコンストラクタは、 std::decay<F>::typestd::packaged_task<R(ArgTypes...)> と同じ型の場合、オーバーロード解決に参加しません。
4) コピーコンストラクタは削除されています。 std::packaged_task はムーブオンリーです。
5) それまで rhs によって所有されていた共有状態とタスクを持つ std::packaged_task を構築します。 rhs は共有状態を持たなくなり、タスクはムーブされた状態になります。

目次

[編集] 引数

f - 実行する callable なターゲット (関数、メンバ関数、ラムダ式、関数オブジェクト)
a - タスクを格納するときに使用するアロケータ
rhs - ムーブする std::packaged_task

[編集] 例外

2) f のコピー/ムーブコンストラクタによって投げられるあらゆる例外。 確保に失敗した場合 std::bad_alloc を投げる可能性もあります。
3) f のコピー/ムーブコンストラクタによって、および確保に失敗した場合にアロケータの allocate 関数によって投げられる、あらゆる例外。
4) (なし)

[編集] 欠陥報告

以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。

DR 適用先 発行時の動作 正しい動作
LWG 2067 C++11 the deleted copy constructor took reference to non-const made const

[編集]

#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), 40);
 
    std::cout << "waiting for task to finish...\n";
    std::cout << result.get() << '\n';
 
    std::cout << "task complete\n";
    t.join();
}

出力:

starting task
waiting for task to finish...
102334155
task complete