Files
cppdraft_translate/cppdraft/exec/sync/wait/var.md
2025-10-25 03:02:53 +03:00

2.8 KiB
Raw Blame History

[exec.sync.wait.var]

33 Execution control library [exec]

33.9 Senders [exec.snd]

33.9.13 Sender consumers [exec.consumers]

33.9.13.2 this_thread::sync_wait_with_variant [exec.sync.wait.var]

1

#

The name this_thread::sync_wait_with_variant denotes a customization point object.

For a subexpression sndr, let Sndr be decltype(into_variant(sndr)).

The expression this_thread::sync_wait_with_variant(sndr) is expression-equivalent to the following, except sndr is evaluated only once:apply_sender(get-domain-early(sndr), sync_wait_with_variant, sndr)Mandates:

  • (1.1)

    sender_in<Sndr, sync-wait-env> is true.

  • (1.2)

    The type sync-wait-with-variant-result-type is well-formed.

  • (1.3)

    same_as<decltype(e), sync-wait-with-variant-result-type> is true, where e is the apply_sender expression above.

2

#

The expression sync_wait_with_variant.apply_sender(sndr) is equivalent to:using result_type = sync-wait-with-variant-result-type;if (auto opt_value = sync_wait(into_variant(sndr))) {return result_type(std::move(get<0>(*opt_value)));}return result_type(nullopt);

3

#

The behavior of this_thread::sync_wait_with_variant(sndr) is undefined unless:

  • (3.1)

    It blocks the current thread of execution ([defns.block]) with forward progress guarantee delegation ([intro.progress]) until the specified sender completes. [Note 1: The default implementation of sync_wait_with_variant achieves forward progress guarantee delegation by relying on the forward progress guarantee delegation provided by sync_wait. — end note]

  • (3.2)

    It returns the specified sender's async results as follows:

    • (3.2.1)

      For a value completion, the result datums are returned in an engaged optional object that contains a variant of tuples.

    • (3.2.2)

      For an error completion, an exception is thrown.

    • (3.2.3)

      For a stopped completion, a disengaged optional object is returned.