| Home | Libraries | People | FAQ | More

#### defer (2 of 3 overloads)

Submits a completion token or function object for execution.

    template<
        typename Executor,
        typename CompletionToken>
    DEDUCED defer(
        const Executor & ex,
        CompletionToken && token,
        typename enable_if< is_executor< Executor >::value >::type *  = 0);

This function submits an object for execution using the specified executor. The function object is queued for execution, and is never called from the current thread prior to returning from `defer()`.

The use of `defer()`, rather than `post` , indicates the caller's preference that the executor defer the queueing of the function object. This may allow the executor to optimise queueing for cases when the function object represents a continuation of the current call context.

This function has the following effects:

- Constructs a function object handler of type `Handler`, initialized with `handler(forward<CompletionToken>(token))`.
- Constructs an object `result` of type `async_result<Handler>`, initializing the object as `result(handler)`.
- Obtains the handler's associated executor object `ex1` by performing `get_associated_executor(handler)`.
- Creates a work object `w` by performing `make_work(ex1)`.
- Obtains the handler's associated allocator object `alloc` by performing `get_associated_allocator(handler)`.
- Constructs a function object `f` with a function call operator that performs `ex1.dispatch(std::move(handler), alloc)` followed by `w.reset()`.
- Performs `Executor(ex).defer(std::move(f), alloc)`.
- Returns `result.get()`.