[expr.yield] # 7 Expressions [[expr]](./#expr) ## 7.6 Compound expressions [[expr.compound]](expr.compound#expr.yield) ### 7.6.17 Yielding a value [expr.yield] [yield-expression:](#nt:yield-expression "7.6.17 Yielding a value [expr.yield]") co_yield [*assignment-expression*](expr.assign#nt:assignment-expression "7.6.19 Assignment and compound assignment operators [expr.assign]") co_yield [*braced-init-list*](dcl.init.general#nt:braced-init-list "9.5.1 General [dcl.init.general]") [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L7971) A [*yield-expression*](#nt:yield-expression "7.6.17 Yielding a value [expr.yield]") shall appear only within a suspension context of a function ([[expr.await]](expr.await "7.6.2.4 Await"))[.](#1.sentence-1) Let *e* be the operand of the [*yield-expression*](#nt:yield-expression "7.6.17 Yielding a value [expr.yield]") and*p* be an lvalue naming the promise object of the enclosing coroutine ([[dcl.fct.def.coroutine]](dcl.fct.def.coroutine "9.6.4 Coroutine definitions")), then the [*yield-expression*](#nt:yield-expression "7.6.17 Yielding a value [expr.yield]") is equivalent to the expressionco_await *p*.yield_value(*e*)[.](#1.sentence-2) [*Example [1](#example-1)*: template 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> g1() {for (int i = 0; i < 10; ++i) co_yield {i,i};} my_generator> g2() {for (int i = 0; i < 10; ++i) co_yield make_pair(i,i);}auto f(int x = co_yield 5); // error: [*yield-expression*](#nt:yield-expression "7.6.17 Yielding a value [expr.yield]") outside of function suspension contextint a[] = { co_yield 1 }; // error: [*yield-expression*](#nt:yield-expression "7.6.17 Yielding a value [expr.yield]") outside of function suspension contextint main() {auto r1 = g1(); auto r2 = g2(); assert(std::equal(r1.begin(), r1.end(), r2.begin(), r2.end()));} — *end example*]