std::generator<Ref,V,Allocator>::promise_type::yield_value

std::suspend_always yield_value( yielded val ) noexcept;
(1) (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) (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) (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 );
(4) (C++23 起)

一种协程接口函数的实现,内部使用以支持 operator co_yield

(yieldedstd::generator 中定义的引用类型。)

1) 赋值 std::addressof(val)value_。返回 {}
2) 返回未指明类型的可等待对象,存储一个以 lval 直接非列表初始化std::remove_cvref_t<yielded> 类型的对象,其各成员函数被配置为使得 value_ 指向所存储的对象。然后暂停协程。
3)x 为某个 generator 对象。

返回未指明类型的可等待对象,g.range 被移动如其中,

  • 其成员 await_ready 返回 false
  • 其成员 await_suspendg.range.coroutine_ 推入 *x.active_
  • 恢复 g.range.coroutine_ 所代表的协程的执行,并且
  • 其成员 await_resume 求值
  • std::rethrow_exception(except_)bool(except_)true
  • bool(except_)false,则 await_resume 成员没有效果。
g.range.coroutine_ 所代表的协程必须在其初始暂停点暂停。否则其行为未定义。
4) 等价于:
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) 某个生成器对象的 *active_ 的顶端必须为一个代表以 *this 为承诺对象的协程的句柄。否则其行为未定义。
2-4) 调用这些重载的 yield-表达式 的类型为 void

参数

val - yield-表达式 求值结果的值
lval - yield-表达式 求值结果的左值
g - 由生成器产生的元素范围
r - 元素范围

返回值

1) std::suspend_always 类型的可等待对象。
2-4) 如上所述的未指明类型的可等待对象。

异常

2,4) 可能抛出由所存储对象的初始化所抛出的任何异常。

示例