[/ / Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com) / / Distributed under the Boost Software License, Version 1.0. (See accompanying / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) /] [section:Receiver Receiver concepts] 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 concept receiver = move_constructible> && constructible_from, T> && requires(remove_cvref_t&& t, E&& e) { { execution::set_done(std::move(t)) } noexcept; { execution::set_error(std::move(t), (E&&) e) } noexcept; }; template concept receiver_of = receiver && requires(remove_cvref_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: * None of a receiver’s completion-signal operations shall be invoked before `execution::start` has been called on the operation state object that was returned by `execution::connect` to connect that receiver to a sender. * Once `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. * If `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. [endsect]