std::packaged_task
的推導指南
來自 cppreference.com
< cpp | thread | packaged_task
在標頭檔案 <future> 中定義 |
||
template< class R, class... Args > packaged_task( R(*)(Args...) ) -> packaged_task<R(Args...)>; |
(1) | (C++17 起) |
template< class F > packaged_task( F ) -> packaged_task</*見下文*/>; |
(2) | (C++17 起) |
template< class F > packaged_task( F ) -> packaged_task</*見下文*/>; |
(3) | (C++23 起) |
template< class F > packaged_task( F ) -> packaged_task</*見下文*/>; |
(4) | (C++23 起) |
2) 僅當 &F::operator() 在作為未求值運算元處理時是格式良好的,並且 decltype(&F::operator()) 的形式為 R(G::*)(A...)(可選 cv 限定,可選 noexcept,可選左值引用限定)時,此過載才參與過載決議。推導的型別為 std::packaged_task<R(A...)>。
3) 僅當 &F::operator() 在作為未求值運算元處理時是格式良好的,並且 F::operator() 是一個顯式物件引數函式,其型別為 R(G, A...) 或 R(G, A...) noexcept 的形式時,此過載才參與過載決議。推導的型別為 std::packaged_task<R(A...)>。
4) 僅當 &F::operator() 在作為未求值運算元處理時是格式良好的,並且 F::operator() 是一個靜態成員函式,其型別為 R(A...) 或 R(A...) noexcept 的形式時,此過載才參與過載決議。推導的型別為 std::packaged_task<R(A...)>。
[編輯] 注意
這些推導指南不允許從帶有省略號引數的函式進行推導,並且型別中的 ... 總是被視為包擴充套件。
[編輯] 示例
執行此程式碼
#include <future> int func(double) { return 0; } int main() { std::packaged_task f{func}; // deduces packaged_task<int(double)> int i = 5; std::packaged_task g = [&](double) { return i; }; // => packaged_task<int(double)> }