4208. Wording needs to ensure that in connect(sndr, rcvr) that rcvr expression is only evaluated once

Section: 33.9.10 [exec.connect] Status: Ready Submitter: Eric Niebler Opened: 2025-02-07 Last modified: 2025-02-11

Priority: Not Prioritized

View all issues with Ready status.

Discussion:

Imported from cplusplus/sender-receiver #325.

The current wording of connect(sndr, rcvr) defines the new_sndr expression as transform_sender(decltype(get-domain-late(sndr, get_env(rcvr))){}, sndr, get_env(rcvr)).

It then defines connect(sndr, rcvr) as expression equivalent to new_sndr.connect(rcvr).

As currently worded, this requires evaluating the rcvr expression twice. Note that the first usage in the new_sndr expression is unevaluated, but the second usage in get_env(rcvr) is evaluated.

I think we need to add an extra sentence at the end of this section saying "Where the expression rcvr is only evaluated once." or similar.

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

Proposed resolution:

This wording is relative to N5001.

  1. Modify 33.9.10 [exec.connect] as indicated:

    -6- The expression connect(sndr, rcvr) is expression-equivalent to:

    1. (6.1) — new_sndr.connect(rcvr) if that expression is well-formed.

      Mandates: The type of the expression above satisfies operation_state.

    2. (6.2) — Otherwise, connect-awaitable(new_sndr, rcvr).

    except that rcvr is evaluated only once.

    Mandates: sender<Sndr> && receiver<Rcvr> is true.