Title
default_domain::transform_env should be returning FWD-ENV(env)
Status
ready
Section
[exec.domain.default]
Submitter
Eric Niebler

Created on 2025-02-07.00:00:00 last changed 2 months ago

Messages

Date: 2025-02-11.17:35:18

Proposed resolution:

This wording is relative to N5001.

  1. Modify [exec.domain.default] as indicated:

    template<sender Sndr, queryable Env>
      constexpr queryable decltype(auto) transform_env(Sndr&& sndr, Env&& env) noexcept;
    

    -5- Let `e` be the expression

    tag_of_t<Sndr>().transform_env(std::forward<Sndr>(sndr), std::forward<Env>(env))
    

    if that expression is well-formed; otherwise, static_cast<Env>FWD-ENV(std::forward<Env>(env)).

    -6- Mandates: `noexcept(e)` is `true`.

    -7- Returns: `e`.

Date: 2025-02-11.17:35:18

[ Hagenberg 2025-02-11; move to Ready ]

Date: 2025-02-07.00:00:00

Imported from cplusplus/sender-receiver #168.

When writing a generic recursive sender transform, you need to ability to unpack an unknown sender `S` and recursively transform the children.

For that, it can be useful to know the type of the environment that `S` will use when connecting its child senders, which is why `transform_env` exists.

For an environment `E` and a sender `S` with tag `T` child `C`, the expression `default_domain().transform_env(S, E)` should return an environment `E2` that is identical to the environment of the receiver that `S` uses to connect `C`.

`default_domain().transform_env(S, E)` will first check whether `T().transform_env(S, E)` is well-formed. If so, it will return that (e.g. `when_all_t` has a `transform_env` that adds a stop token to the environment).

If `T().transform_env(S, E)` is not well-formed, what should `default_domain::transform_env` do? At present, it returns `E` unmodified.

But [exec.adapt.general] has this:

[unless otherwise specified, when] a parent sender is connected to a receiver `rcvr`, any receiver used to connect a child sender has an associated environment equal to FWD-ENV(get_env(rcvr)).

So the correct thing for `default_domain::transform_env` to do is to return FWD-ENV(get_env(rcvr)).

History
Date User Action Args
2025-02-11 17:35:18adminsetmessages: + msg14637
2025-02-11 17:35:18adminsetstatus: new -> ready
2025-02-09 14:24:58adminsetmessages: + msg14628
2025-02-07 00:00:00admincreate