[exec.stopped.opt] # 33 Execution control library [[exec]](./#exec) ## 33.9 Senders [[exec.snd]](exec.snd#exec.stopped.opt) ### 33.9.12 Sender adaptors [[exec.adapt]](exec.adapt#exec.stopped.opt) #### 33.9.12.14 execution​::​stopped_as_optional [exec.stopped.opt] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L4789) stopped_as_optional maps a sender's stopped completion operation into a value completion operation as a disengaged optional[.](#1.sentence-1) The sender's value completion operation is also converted into an optional[.](#1.sentence-2) The result is a sender that never completes with stopped, reporting cancellation by completing with a disengaged optional[.](#1.sentence-3) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L4797) The name stopped_as_optional denotes a pipeable sender adaptor object[.](#2.sentence-1) For a subexpression sndr, let Sndr be decltype((sndr))[.](#2.sentence-2) The expression stopped_as_optional(sndr) is expression-equivalent to:transform_sender(*get-domain-early*(sndr), *make-sender*(stopped_as_optional, {}, sndr)) except that sndr is only evaluated once[.](#2.sentence-3) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L4806) The exposition-only class template *impls-for* ([[exec.snd.expos]](exec.snd.expos "33.9.2 Exposition-only entities")) is specialized for stopped_as_optional_t as follows: [🔗](#lib:impls-for%3cstopped_as_optional_t%3e) namespace std::execution {template<>struct *impls-for* : *default-impls* {templatestatic consteval void *check-types*() {*default-impls*::*check-types*(); if constexpr (!requires {requires (![same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]"), *FWD-ENV-T*(Env)...>>); })throw *unspecified-exception*(); }};} where *unspecified-exception* is a type derived from exception[.](#3.sentence-1) [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L4829) Let sndr and env be subexpressions such that Sndr is decltype((sndr)) andEnv is decltype((env))[.](#4.sentence-1) If [*sender-for*](exec.snd.concepts#concept:sender-for "33.9.3 Sender concepts [exec.snd.concepts]") is false then the expression stopped_as_optional.transform_sender(sndr, env) is ill-formed; otherwise, if [sender_in](exec.snd.concepts#concept:sender_in "33.9.3 Sender concepts [exec.snd.concepts]")<*child-type*, *FWD-ENV-T*(Env)> is false, the expression stopped_as_optional.transform_sender(sndr, env) is equivalent to *not-a-sender*(); otherwise, it is equivalent to:auto&& [_, _, child] = sndr;using V = *single-sender-value-type*<*child-type*, *FWD-ENV-T*(Env)>;return let_stopped( then(std::forward_like(child), [](Ts&&... ts) noexcept(is_nothrow_constructible_v) {return optional(in_place, std::forward(ts)...); }), []() noexcept { return just(optional()); });