|  | Home | Libraries | People | FAQ | More | 
        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.