[expr.yield] (original) (raw)

7 Expressions [expr]

7.6 Compound expressions [expr.compound]

7.6.17 Yielding a value [expr.yield]

A yield-expression shall appear only within a suspension context of a function ([expr.await]).

Let e be the operand of the yield-expression and_p_ be an lvalue naming the promise object of the enclosing coroutine ([dcl.fct.def.coroutine]), then the yield-expressionis equivalent to the expressionco_await p.yield_value(e).

[Example 1: template <typename T> struct my_generator { struct promise_type { T current_value;auto yield_value(T v) { current_value = std::move(v);return std::suspend_always{};} };struct iterator { }; iterator begin(); iterator end();}; my_generator<pair<int,int>> g1() { for (int i = 0; i < 10; ++i) co_yield {i,i};}my_generator<pair<int,int>> g2() { for (int i = 0; i < 10; ++i) co_yield make_pair(i,i);} auto f(int x = co_yield 5); int a[] = { co_yield 1 }; int main() { auto r1 = g1();auto r2 = g2(); assert(std::equal(r1.begin(), r1.end(), r2.begin(), r2.end()));} — _end example_]