13 Asynchronous model [async]

13.2 Requirements [async.reqmts]

13.2.4 Service requirements [async.reqmts.service]

A class is a service if it is publicly and unambiguously derived from execution_context::service, or if it is publicly and unambiguously derived from another service. For a service S, S::key_type shall be valid and denote a type (C++ 2014 [temp.deduct]), is_base_of_v<typename S::key_type, S> shall be true, and S shall satisfy the Destructible requirements (C++ 2014 [destructible]).

The first parameter of all service constructors shall be an lvalue reference to execution_context. This parameter denotes the execution_context object that represents a set of services, of which the service object will be a member. [ Note: These constructors can be called by the make_service function.  — end note ]

A service shall provide an explicit constructor with a single parameter of lvalue reference to execution_context. [ Note: This constructor can be called by the use_service function.  — end note ]

Example:

class my_service : public execution_context::service{
public:
  using key_type = my_service;
  explicit my_service(execution_context& ctx);
  my_service(execution_context& ctx, int some_value);
private:
  virtual void shutdown() noexcept override;
  ...
};

 — end example ]

A service's shutdown member function shall destroy all copies of function objects that are held by the service.