#### Production of initiating function return value

An initiating function produces its return type as follows:

— constructing an object `result` of type `async_result<decay_t<CompletionToken>, Signature>`, initialized as `result(completion_handler)`; and

— using `result.get()` as the operand of the return statement.

[Example: Given an asynchronous operation with Completion signature `void(R1 r1, R2 r2)`, an initiating function meeting these requirements may be implemented as follows:

    template<class CompletionToken>
    auto async_xyz(T1 t1, T2 t2, CompletionToken&& token)
    {
      typename async_result<decay_t<CompletionToken>, void(R1, R2)>::completion_handler_type
        completion_handler(forward<CompletionToken>(token));

      async_result<decay_t<CompletionToken>, void(R1, R2)> result(completion_handler);

      // initiate the operation and cause completion_handler to be invoked with
      // the result

      return result.get();
    }

For convenience, initiating functions may be implemented using the `async_completion` template:

    template<class CompletionToken>
    auto async_xyz(T1 t1, T2 t2, CompletionToken&& token)
    {
      async_completion<CompletionToken, void(R1, R2)> init(token);

      // initiate the operation and cause init.completion_handler to be invoked
      // with the result

      return init.result.get();
    }

—end example]