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</*see below*/>; |
(2) | (C++17 起) |
template< class F > packaged_task( F ) -> packaged_task</*see below*/>; |
(3) | (C++23 起) |
template< class F > packaged_task( F ) -> packaged_task</*see below*/>; |
(4) | (C++23 起) |
2) 此重载只有在 &F::operator() 在作为不求值运算数时为良构且 decltype(&F::operator()) 拥有形式 R(G::*)(A...) (可选地有 cv 限定,可选地有 noexcept , 可选地有左值引用限定)而
G
为类类型时才会参与重载决议。推导类型为 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}; // 推导出 packaged_task<int(double)> int i = 5; std::packaged_task g = [&](double) { return i; }; // 推导出 packaged_task<int(double)> }