[/ / Copyright (c) 2003-2021 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:Sender Sender concepts] [heading sender and sender_to] template concept sender = move_constructible> && !requires { typename sender_traits>::__unspecialized; // exposition only }; template concept sender_to = sender && receiver && requires (S&& s, R&& r) { execution::connect((S&&) s, (R&&) r); }; None of these operations shall introduce data races as a result of concurrent invocations of those functions from different threads. A sender type's destructor shall not block pending completion of the submitted function objects. [inline_note The ability to wait for completion of submitted function objects may be provided by the associated execution context.] [heading typed_sender] A sender is [*typed] if it declares what types it sends through a receiver's channels. The `typed_sender` concept is defined as: template class Tuple, template class Variant> class> struct has-value-types; // exposition only template class Variant> struct has-error-types; // exposition only template concept has-sender-types = // exposition only requires { typename has-value-types; typename has-error-types; typename bool_constant; }; template concept typed_sender = sender && has-sender-types>>; [endsect]