Open
Description
[exec.let]/p9 reads:
Given a type
Tag
and a packArgs
, letas-sndr2
be an alias template such thatas-sndr2<Tag(Args...)>
denotes the typecall-result-t<Fn, decay_t<Args>&...>
. Thenops2_variant_t
denotes the typevariant<monostate, connect_result_t<as-sndr2<LetSigs>, receiver2<Rcvr, Env>>...>
except with duplicate types removed.
The type Env
is not specified. It should be env_t
from paragraph 7.
Paragraphs 8, 9, and 10 only make sense in relation to the lambda in paragraph 7, but that is not at all clear from the current wording. I suggest making paragraphs 8, 9, and 10 sub-bullets of paragraph 7.
Proposed Resolution
Change [exec.let] para 7-10 as follows (includes the proposed fix for #316):
7. impls-for<decayed-typeof<let-cpo>>::get-state is initialized with a
callable object equivalent to the following:
[]<class Sndr, class Rcvr>(Sndr&& sndr, Rcvr& rcvr) requires see below {
auto& [_, fn, child] = sndr;
using fn_t = decay_t<decltype(fn)>;
using env_t = decltype(let-env(child));
using args_variant_t = see below;
using ops2_variant_t = see below;
struct state-type {
fn_t fn; // exposition only
env_t env; // exposition only
args_variant_t args; // exposition only
ops2_variant_t ops2; // exposition only
};
return state-type{std::forward_like<Sndr>(fn), let-env(child), {}, {}};
}
- (7.1) Let Sigs be a pack of the arguments to the completion_signatures
specialization named by
- completion_signatures_of_t<child-type<Sndr>, env_of_t<Rcvr>>. Let
+ completion_signatures_of_t<child-type<Sndr>, FWD-ENV-T(env_of_t<Rcvr>)>. Let
LetSigs be a pack of those types in Sigs with a return type of
decayed-typeof<set-cpo>. Let as-tuple be an alias template such
that as-tuple<Tag(Args...)> denotes the type
decayed-tuple<Args...>. Then args_variant_t denotes the type
variant<monostate, as-tuple<LetSigs>...> except with duplicate
types removed.
- (7.2) Given a type Tag and a pack Args, let as-sndr2 be an alias template
such that as-sndr2<Tag(Args...)> denotes the type call-result-t<Fn,
decay_t<Args>&...>. Then ops2_variant_t denotes the type
- variant<monostate, connect_result_t<as-sndr2<LetSigs>, receiver2<Rcvr, Env>>...>
+ variant<monostate, connect_result_t<as-sndr2<LetSigs>, receiver2<Rcvr, env_t>>...>
except with duplicate types removed.
- (7.3) The requires-clause constraining the above lambda is satisfied if
and only if the types args_variant_t and ops2_variant_t are
well-formed.