![]() |
A customisation point that submits a sender to a receiver.
constexpr unspecified submit = unspecified;
The name execution::submit 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::submit(s, r) is ill-formed if sender_to<S,
R> is not true. Otherwise, it is expression-equivalent
to:
s.submit(r), if that expression is valid and S
models sender. If the function selected does not submit
the receiver object r via the sender s, the
program is ill-formed with no diagnostic required.
submit(s, r), if that expression is valid and
S models sender, with overload resolution performed
in a context that includes the declaration void submit();
and that does not include a declaration of execution::submit.
If the function selected by overload resolution does not submit the receiver
object r via the sender s, the program is ill-formed
with no diagnostic required.
execution::start((new submit_receiver<S, R>{s,r})->state_),
where submit_receiver is an implementation-defined class
template equivalent to:
template<class S, class R>
struct submit_receiver {
struct wrap {
submit_receiver * p_;
template<class...As>
requires receiver_of<R, As...>
void set_value(As&&... as) &&
noexcept(is_nothrow_receiver_of_v<R, As...>) {
execution::set_value(std::move(p_->r_), (As&&) as...);
delete p_;
}
template<class E>
requires receiver<R, E>
void set_error(E&& e) && noexcept {
execution::set_error(std::move(p_->r_), (E&&) e);
delete p_;
}
void set_done() && noexcept {
execution::set_done(std::move(p_->r_));
delete p_;
}
};
remove_cvref_t<R> r_;
connect_result_t<S, wrap> state_;
submit_receiver(S&& s, R&& r)
: r_((R&&) r)
, state_(execution::connect((S&&) s, wrap{this})) {}
};
Header: asio/execution/submit.hpp
Convenience header: asio/execution.hpp