![]() |
Home | Libraries | People | FAQ | More |
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: boost/asio/execution/connect.hpp
Convenience header: boost/asio/execution.hpp