std::packaged_task の推論ガイド
From 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() が評価されないオペランドとして扱われた場合に well-formed であり、かつ decltype(&F::operator()) が R(G::*)(A...) の形式(オプションで cv 修飾、オプションで noexcept、オプションで lvalue 参照修飾)である場合にのみ、オーバーロード解決に参加します。推論される型は std::packaged_task<R(A...)> です。
3) このオーバーロードは、&F::operator() が評価されないオペランドとして扱われた場合に well-formed であり、かつ F::operator() が 明示的なオブジェクトパラメータ関数であり、その型が R(G, A...) または R(G, A...) noexcept の形式である場合にのみ、オーバーロード解決に参加します。推論される型は std::packaged_task<R(A...)> です。
4) このオーバーロードは、&F::operator() が評価されないオペランドとして扱われた場合に well-formed であり、かつ 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)> }