public member function
<future>

std::packaged_task::operator()

void operator()(Args... args);
调用存储的任务
调用*存储的任务*,将其参数 args 转发给它。

- 如果*存储的任务*的调用成功完成,它返回的值(如果有)将存储在*共享状态*中。
- 如果*存储的任务*的调用抛出异常,该异常将被捕获并也存储在*共享状态*中。

在这两种情况下,*共享状态*都会变为*就绪*(这将解除阻止任何当前等待它的线程)。

可以通过调用先前调用成员函数 get_future 返回的*future*对象上的 get 来访问*共享状态*。

通常在*构造时*指定*存储的任务*。调用它的效果取决于其类型。

  • 如果*存储的任务*是*函数指针*或*函数对象*,则会转发参数给调用。
  • 如果*存储的任务*是*指向非静态成员函数的指针*,它将使用第一个参数作为调用成员的对象(这可能是对象、引用或其指针),其余参数将作为成员函数的参数转发。
  • 如果它是*指向非静态数据成员的指针*,它应该只带一个参数调用,并且该函数将存储在*共享状态*中对其参数的成员的引用(参数可能是对象、引用或其指针)。

参数

args...
调用的参数。
如果*存储的任务*的类型是*成员指针*,第一个参数应该是定义了该成员的对象(或其引用或指针)。

Args... 是*packaged_task*模板参数,它们表示*存储的任务*的参数类型。

返回值

无。

*存储的任务*的返回值(如果有)将存储在*共享状态*中。

数据竞争

*packaged_task*已被修改。
共享状态被修改为原子操作(不会导致数据竞争)。

异常安全

基本保证:如果抛出异常,*packaged_task*处于有效状态。

此成员函数在以下条件下抛出异常
exception typeerror condition描述
future_errorfuture_errc::no_state该对象没有*共享状态*(它是*默认构造*的*packaged_task*)。
future_errorfuture_errc::promise_already_satisfied*存储的任务*已被调用。
此成员函数在参数的任何复制或移动操作抛出异常时也会抛出,并且(取决于库实现)也可能抛出以报告其他情况。

另见