then attaches an invocable as a continuation
for an input sender's value completion operation.
upon_error and upon_stopped do the same
for the error and stopped completion operations, respectively,
sending the result of the invocable as a value completion.
The names then, upon_error, and upon_stopped
denote pipeable sender adaptor objects.
Let the expression then-cpo be one of
then, upon_error, or upon_stopped.
For subexpressions sndr and f,
if decltype((sndr)) does not satisfy sender, or
decltype((f)) does not satisfy movable-value,
then-cpo(sndr, f)is ill-formed.
Otherwise,
the expression then-cpo(sndr, f) is expression-equivalent to:
transform_sender(get-domain-early(sndr), make-sender(then-cpo, f, sndr))
except that sndr is evaluated only once.
Effects: Equivalent to:
auto cs = get_completion_signatures<child-type<Sndr>, FWD-ENV-T(Env)...>();
auto fn =[]<class... Ts>(set_value_t(*)(Ts...)){ifconstexpr(!invocable<remove_cvref_t<data-type<Sndr>>, Ts...>)throwunspecified-exception();
};
cs.for-each(overload-set{fn, [](auto){}});
where unspecified-exception is
a type derived from exception.
invokes f or a copy of such
with the value, error, or stopped result datums of sndr
for then, upon_error, and upon_stopped, respectively,
using the result value of f as out_sndr's value completion, and