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::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 起) |
3) 分配器 a 用於分配儲存任務所需的記憶體。
4) 複製建構函式被刪除,
std::packaged_task
僅支援移動。5) 構造一個
std::packaged_task
,其共享狀態和任務由 rhs 先前擁有,而 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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
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) 未考慮衰變 | 考慮衰變 |