std::genera...:yield_value(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

🌸 NAME 🌸

std::generator::promise_type::yield_value β€” std::generator::promise_type::yield_value πŸ’…

okay bestie, this is the page for std::genera...:yield_value(3) from the C++ Standard Libary manual, and we're literally about to get into it. no cap, it's giving coroutine internals with main character energy ✨


✨ Synopsis ✨

std::suspend_always yield_value( yielded val ) noexcept;

(1) (since C++23)

auto yield_value( const std::remove_reference_t<yielded>& lval )

    requires std::is_rvalue_reference_v<yielded> &&
             std::constructible_from<std::remove_cvref_t<yielded>,
                                     const std::remove_reference_t<yielded>&>;

(2) (since C++23)

template< class R2, class V2, class Alloc2, class Unused >

    requires std::same_as<typename std::generator<T2, V2, Alloc2>::yielded, yielded>

auto yield_value( ranges::elements_of<std::generator<T2, V2, Alloc2>&&,
                                      Unused> g ) noexcept;

(3) (since C++23)

template< ranges::input_range R, class Alloc >

    requires std::convertible_to<ranges::range_reference_t<R>, yielded>

auto yield_value( ranges::elements_of<R, Alloc> r ) noexcept;

(4) (since C++23)

An implementation of coroutine interface functions used internally to support operator co_yield πŸŒ€

(yielded is a reference type defined in std::generator.)

  1. Assigns std::addressof(val) to value_. Returns {} πŸ’–
  2. Returns an awaitable object of an unspecified type that stores an object of type std::remove_cvref_t<yielded> direct-non-list-initialized with lval, whose member functions are configured so that value_ points to that stored object. Then suspends the coroutine 😴
  3. Let x be some generator object.

Returns an awaitable object of an unspecified type into which g.range is moved,

  • whose member await_ready returns false,
  • whose member await_suspend pushes g.range.coroutine_ into *x.active_ and
  • resumes execution of the coroutine referred to by g.range.coroutine_, and
  • whose member await_resume evaluates
    • std::rethrow_exception(except_) if bool(except_) is true.
    • If bool(except_) is false, the await_resume member has no effects.

The coroutine referred to by g.range.coroutine_ must be suspended at its initial suspend point. Otherwise the behavior is undefined 🚨

  1. Equivalent to:
auto nested = [](std::allocator_arg_t, Alloc, ranges::iterator_t<R> i,
                 ranges::sentinel_t<R> s) ->
    std::generator<yielded, ranges::range_value_t<R>, Alloc>
{
    for (; i != s; ++i)
        co_yield static_cast<yielded>(*i);
};

return yield_value(ranges::elements_of(nested(
    allocator_arg, r.allocator, ranges::begin(r.range),
    ranges::end(r.range))));

2,3) A handle referring to the coroutine whose promise object is *this must be at the top of *active_ of some generator object. Otherwise the behavior is undefined. πŸ’€

2-4) A yield-expression that calls these overload has the type void.


πŸ’– Parameters πŸ’–

  • val β€” a value which is a result of the yield-expression evaluation
  • lval β€” an lvalue which is a result of the yield-expression evaluation
  • g β€” a range of elements produced by a generator
  • r β€” a range of elements

πŸ¦‹ Return value πŸ¦‹

  1. The awaitable object of type std::suspend_always. 2-4. An awaitable object of an unspecified type as described above.

πŸ’… Exceptions πŸ’…

  1. May throw any exception thrown by the initialization of the stored object.

made with πŸ’– from http://cppreference.com, dated 2024.06.10, for std::genera...:yield_value(3) β€” bye bestie 🫢✨

πŸ“¦ where this page comes from