A receiver represents the continuation of an asynchronous operation. An asynchronous
operation may complete with a (possibly empty) set of values, an error, or
it may be cancelled. A receiver has three principal operations corresponding
to the three ways an asynchronous operation may complete: set_value
,
set_error
, and set_done
. These are collectively
known as a receiver’s completion-signal operations.
template<class T, class E = exception_ptr> concept receiver = move_constructible<remove_cvref_t<T>> && constructible_from<remove_cvref_t<T>, T> && requires(remove_cvref_t<T>&& t, E&& e) { { execution::set_done(std::move(t)) } noexcept; { execution::set_error(std::move(t), (E&&) e) } noexcept; }; template<class T, class... An> concept receiver_of = receiver<T> && requires(remove_cvref_t<T>&& t, An&&... an) { execution::set_value(std::move(t), (An&&) an...); };
The receiver’s completion-signal operations have semantic requirements that are collectively known as the receiver contract, described below:
execution::start
has been called on the operation
state object that was returned by execution::connect
to
connect that receiver to a sender.
execution::start
has been called on the operation state
object, exactly one of the receiver’s completion-signal operations
shall complete non-exceptionally before the receiver is destroyed.
execution::set_value
exits with an exception, it is still
valid to call execution::set_error
or execution::set_done
on the receiver.
Once one of a receiver’s completion-signal operations has completed non-exceptionally, the receiver contract has been satisfied.