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
.
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
.
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; } };
execution::connect(s, r)
is ill-formed.
Header: asio/execution/connect.hpp
Convenience header: asio/execution.hpp