### execution::connect

A customisation point that connects a sender to a receiver.

    constexpr unspecified connect = unspecified;

The name `execution::connect` denotes a customisation point object. For some subexpressions `s` and `r`, let `S` be a type such that `decltype((s))` is `S` and let `R` be a type such that `decltype((r))` is `R`. The expression `execution::connect(s, r)` is expression-equivalent to:

- `s.connect(r)`, if that expression is valid, if its type satisfies `operation_state`, and if `S` satisfies `sender`.
- Otherwise, `connect(s, r)`, if that expression is valid, if its type satisfies `operation_state`, and if `S` satisfies `sender`, with overload resolution performed in a context that includes the declaration `void connect();` and that does not include a declaration of `execution::connect`.
- Otherwise, `as_operation{s, r}`, if `r` is not an instance of `as_receiver<F, S>` for some type `F`, and if `receiver_of<R> && executor_of<remove_cvref_t<S>, as_invocable<remove_cvref_t<R>, S>>` is `true`, where `as_operation` is an implementation-defined class equivalent to

    template <class S, class R>
     struct as_operation
     {
       remove_cvref_t<S> e_;
       remove_cvref_t<R> r_;
       void start() noexcept try {
         execution::execute(std::move(e_),
             as_invocable<remove_cvref_t<R>, S>{r_});
       } catch(...) {
         execution::set_error(std::move(r_), current_exception());
       }
     };

and `as_invocable` is a class template equivalent to the following:

    template<class R>
     struct as_invocable
     {
       R* r_;
       explicit as_invocable(R& r) noexcept
         : r_(std::addressof(r)) {}
       as_invocable(as_invocable && other) noexcept
         : r_(std::exchange(other.r_, nullptr)) {}
       ~as_invocable() {
         if(r_)
           execution::set_done(std::move(*r_));
       }
       void operator()() & noexcept try {
         execution::set_value(std::move(*r_));
         r_ = nullptr;
       } catch(...) {
         execution::set_error(std::move(*r_), current_exception());
         r_ = nullptr;
       }
     };

- Otherwise, `execution::connect(s, r)` is ill-formed.

##### Requirements

Header: `asio/execution/connect.hpp`

Convenience header: `asio/execution.hpp`