Files
hustoj/web/cppreference-zh/chmhelp/cpp-coroutine-coroutine_handle.html
2025-08-01 12:57:54 +08:00

377 lines
25 KiB
HTML

<!DOCTYPE html>
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>std::coroutine_handle</title>
<link rel="stylesheet" href="ext.css" />
<link rel="stylesheet" href="site_modules.css" />
</head>
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_coroutine_coroutine_handle skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading"><span style="font-size:0.7em; line-height:130%">std::</span>coroutine_handle</h1>
<div id="bodyContent">
<div id="contentSub"><span class="subpages">&lt; <a href="cpp.html">cpp</a>&lrm; | <a href="cpp-coroutine.html">coroutine</a></span></div>
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
<table class="t-dcl-begin">
<tbody>
<tr class="t-dsc-header">
<td>
<div>&#23450;&#20041;&#20110;&#22836;&#25991;&#20214; <code><a href="cpp-header-coroutine.html">&lt;coroutine&gt;</a></code></div>
</td>
<td></td>
<td></td>
</tr>
<tr class="t-dcl t-since-cxx20">
<td>
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1">&lt;</span> <span class="kw1">class</span> Promise <span class="sy1">=</span> <span class="kw4">void</span> <span class="sy1">&gt;</span> <span class="kw1">struct</span> coroutine_handle<span class="sy4">;</span></span></div>
</td>
<td>(1)</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
<tr class="t-dcl t-since-cxx20">
<td>
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1">&lt;&gt;</span> <span class="kw1">struct</span> coroutine_handle<span class="sy1">&lt;</span><span class="kw4">void</span><span class="sy1">&gt;</span><span class="sy4">;</span></span></div>
</td>
<td>(2)</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
<tr class="t-dcl t-since-cxx20">
<td>
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1">&lt;&gt;</span> <span class="kw1">struct</span> coroutine_handle<span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">noop_coroutine_promise</span><span class="sy1">&gt;</span><span class="sy4">;</span></span></div>
</td>
<td>(3)</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
<tr class="t-dcl t-since-cxx20">
<td>
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">using</span> noop_coroutine_handle <span class="sy1">=</span><br />
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">coroutine_handle</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">noop_coroutine_promise</span><span class="sy1">&gt;</span><span class="sy4">;</span></span></div>
</td>
<td>(4)</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
<tr class="t-dcl-sep">
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>&#31867;&#27169;&#26495; <code>coroutine_handle</code> &#33021;&#29992;&#20110;&#25351;&#20195;&#26242;&#20572;&#25110;&#25191;&#34892;&#30340;&#21327;&#31243;&#12290; <code>coroutine_handle</code> &#30340;&#27599;&#20010;&#29305;&#21270;&#22343;&#20026;<a href="cpp-named_req-LiteralType.html"><span style="font-style:italic">&#23383;&#38754;&#31867;&#22411;</span> <span style="font-family: Georgia, &#39;DejaVu Serif&#39;, serif; font-style:italic">(LiteralType)</span></a> &#12290;</p>
<div class="t-li1"><span class="t-li">1)</span> &#20027;&#27169;&#26495;&#65292;&#21487;&#20174; <code>Promise</code> &#31867;&#22411;&#30340;&#25215;&#35834;&#23545;&#35937;&#21019;&#24314;&#12290;</div>
<div class="t-li1"><span class="t-li">2)</span> &#29305;&#21270; <span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">coroutine_handle</span><span class="sy1">&lt;</span><span class="kw4">void</span><span class="sy1">&gt;</span></span></span> &#25830;&#38500;&#25215;&#35834;&#31867;&#22411;&#12290;&#23427;&#21487;&#20174;&#20854;&#20182;&#29305;&#21270;&#36716;&#25442;&#12290;</div>
<div class="t-li1"><span class="t-li">3)</span> &#29305;&#21270; <span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">coroutine_handle</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">noop_coroutine_promise</span><span class="sy1">&gt;</span></span></span> &#25351;&#20195;&#26080;&#25805;&#20316;&#21327;&#31243;&#12290;&#19981;&#33021;&#20174;&#25215;&#35834;&#23545;&#35937;&#21019;&#24314;&#23427;&#12290;</div>
<p>&#20856;&#22411;&#23454;&#29616;&#19978;&#65292; <span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">coroutine_handle</span></span></span> &#30340;&#27599;&#20010;&#29305;&#21270;&#22343;&#20026;<a href="cpp-named_req-TriviallyCopyable.html"><span style="font-style:italic">&#21487;&#24179;&#20961;&#22797;&#21046;</span> <span style="font-family: Georgia, &#39;DejaVu Serif&#39;, serif; font-style:italic">(TriviallyCopyable)</span></a> &#65292;&#24182;&#20445;&#26377;&#19968;&#20010;&#25351;&#21521;&#21327;&#31243;&#29366;&#24577;&#30340;&#25351;&#38024;&#20316;&#20026;&#20854;&#20165;&#26377;&#30340;&#38750;&#38745;&#24577;&#25104;&#21592;&#12290;</p>
<p>&#28155;&#21152; <code>coroutine_handle</code> &#30340;&#29305;&#21270;&#30340;&#31243;&#24207;&#34892;&#20026;&#26410;&#23450;&#20041;&#12290;</p>
<h3><span class="mw-headline" id=".E6.88.90.E5.91.98.E5.87.BD.E6.95.B0">&#25104;&#21592;&#20989;&#25968;</span></h3>
<table class="t-dsc-begin">
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div t-dsc-member-nobold-div">
<div><a href="cpp-coroutine-coroutine_handle-coroutine_handle.html"><span class="t-lines"><span>(&#26500;&#36896;&#20989;&#25968;)</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
</div>
</td>
<td>&#26500;&#36896; <code>coroutine_handle</code> &#23545;&#35937;<br />
<span class="t-mark">(&#20844;&#24320;&#25104;&#21592;&#20989;&#25968;)</span></td>
</tr>
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div">
<div><a href="https://zh.cppreference.com/w/cpp/coroutine/coroutine_handle/operator%3D" title="cpp/coroutine/coroutine handle/operator="><span class="t-lines"><span>operator=</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
</div>
</td>
<td>&#36171;&#20540; <code>coroutine_handle</code> &#23545;&#35937;<br />
<span class="t-mark">(&#20844;&#24320;&#25104;&#21592;&#20989;&#25968;)</span></td>
</tr>
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div">
<div><a href="cpp-coroutine-coroutine_handle-from_promise.html"><span class="t-lines"><span>from_promise</span></span></a></div>
<div><span class="t-lines"><span><span class="t-cmark">[&#38745;&#24577;]</span> <span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
</div>
</td>
<td>&#20174;&#21327;&#31243;&#30340;&#25215;&#35834;&#23545;&#35937;&#21019;&#24314; <code>coroutine_handle</code><br />
<span class="t-mark">(&#20844;&#24320;&#38745;&#24577;&#25104;&#21592;&#20989;&#25968;)</span></td>
</tr>
<tr>
<td colspan="2">
<h5><span class="mw-headline" id=".E8.BD.AC.E6.8D.A2">&#36716;&#25442;</span></h5>
</td>
</tr>
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div">
<div><a href="cpp-coroutine-coroutine_handle-operator_coroutine_handle_void.html"><span class="t-lines"><span>operator coroutine_handle&lt;&gt;</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
</div>
</td>
<td>&#33719;&#24471;&#25830;&#38500;&#31867;&#22411;&#30340; <code>coroutine_handle</code><br />
<span class="t-mark">(&#20844;&#24320;&#25104;&#21592;&#20989;&#25968;)</span></td>
</tr>
<tr>
<td colspan="2">
<h5><span class="mw-headline" id=".E8.A7.82.E5.AF.9F.E5.99.A8">&#35266;&#23519;&#22120;</span></h5>
</td>
</tr>
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div">
<div><a href="cpp-coroutine-coroutine_handle-done.html"><span class="t-lines"><span>done</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
</div>
</td>
<td>&#26816;&#26597;&#21327;&#31243;&#26159;&#21542;&#24050;&#23436;&#25104;<br />
<span class="t-mark">(&#20844;&#24320;&#25104;&#21592;&#20989;&#25968;)</span></td>
</tr>
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div">
<div><a href="cpp-coroutine-coroutine_handle-operator_bool.html"><span class="t-lines"><span>operator bool</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
</div>
</td>
<td>&#26816;&#26597;&#26564;&#26159;&#21542;&#34920;&#31034;&#21327;&#31243;<br />
<span class="t-mark">(&#20844;&#24320;&#25104;&#21592;&#20989;&#25968;)</span></td>
</tr>
<tr>
<td colspan="2">
<h5><span class="mw-headline" id=".E6.8E.A7.E5.88.B6">&#25511;&#21046;</span></h5>
</td>
</tr>
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div">
<div><a href="cpp-coroutine-coroutine_handle-resume.html"><span class="t-lines"><span>operator()</span><span>resume</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
</div>
</td>
<td>&#24674;&#22797;&#21327;&#31243;&#25191;&#34892;<br />
<span class="t-mark">(&#20844;&#24320;&#25104;&#21592;&#20989;&#25968;)</span></td>
</tr>
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div">
<div><a href="cpp-coroutine-coroutine_handle-destroy.html"><span class="t-lines"><span>destroy</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
</div>
</td>
<td>&#38144;&#27585;&#21327;&#31243;<br />
<span class="t-mark">(&#20844;&#24320;&#25104;&#21592;&#20989;&#25968;)</span></td>
</tr>
<tr>
<td colspan="2">
<h5><span class="mw-headline" id=".E6.89.BF.E8.AF.BA.E8.AE.BF.E9.97.AE">&#25215;&#35834;&#35775;&#38382;</span></h5>
</td>
</tr>
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div">
<div><a href="cpp-coroutine-coroutine_handle-promise.html"><span class="t-lines"><span>promise</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
</div>
</td>
<td>&#35775;&#38382;&#21327;&#31243;&#30340;&#25215;&#35834;&#23545;&#35937;<br />
<span class="t-mark">(&#20844;&#24320;&#25104;&#21592;&#20989;&#25968;)</span></td>
</tr>
<tr>
<td colspan="2">
<h5><span class="mw-headline" id=".E5.AF.BC.E5.87.BA.2F.E5.AF.BC.E5.85.A5">&#23548;&#20986;/&#23548;&#20837;</span></h5>
</td>
</tr>
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div">
<div><a href="cpp-coroutine-coroutine_handle-address.html"><span class="t-lines"><span>address</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
</div>
</td>
<td>&#23548;&#20986;&#24213;&#23618;&#22320;&#22336;&#65292;&#21363;&#25903;&#25745;&#21327;&#31243;&#30340;&#25351;&#38024;<br />
<span class="t-mark">(&#20844;&#24320;&#25104;&#21592;&#20989;&#25968;)</span></td>
</tr>
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div">
<div><a href="cpp-coroutine-coroutine_handle-from_address.html"><span class="t-lines"><span>from_address</span></span></a></div>
<div><span class="t-lines"><span><span class="t-cmark">[&#38745;&#24577;]</span> <span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
</div>
</td>
<td>&#20174;&#25351;&#38024;&#23548;&#20837;&#21327;&#31243;<br />
<span class="t-mark">(&#20844;&#24320;&#38745;&#24577;&#25104;&#21592;&#20989;&#25968;)</span></td>
</tr>
</table>
<h3><span class="mw-headline" id=".E9.9D.9E.E6.88.90.E5.91.98.E5.87.BD.E6.95.B0">&#38750;&#25104;&#21592;&#20989;&#25968;</span></h3>
<table class="t-dsc-begin">
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div">
<div><a href="cpp-coroutine-coroutine_handle-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator&lt;=&gt;</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
</div>
</td>
<td>&#27604;&#36739;&#20108;&#20010; <code>coroutine_handle</code> &#23545;&#35937;<br />
<span class="t-mark">(&#20989;&#25968;)</span></td>
</tr>
</table>
<h3><span class="mw-headline" id=".E8.BE.85.E5.8A.A9.E7.B1.BB">&#36741;&#21161;&#31867;</span></h3>
<table class="t-dsc-begin">
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div">
<div><a href="cpp-coroutine-coroutine_handle-hash.html"><span class="t-lines"><span>std::hash<span class="t-dsc-small">&lt;std::coroutine_handle&gt;</span></span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
</div>
</td>
<td><span class="t-lc">std::coroutine_handle</span> &#30340;&#25955;&#21015;&#25903;&#25345;<br />
<span class="t-mark">(&#31867;&#27169;&#26495;&#29305;&#21270;)</span></td>
</tr>
</table>
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">&#27880;&#35299;</span></h3>
<p><code>coroutine_handle</code> &#21487;&#33021;&#24748;&#22402;&#65292;&#35813;&#24773;&#20917;&#19979;&#24517;&#39035;&#35880;&#24910;&#20351;&#29992;&#35813; <code>coroutine_handle</code> &#20197;&#36991;&#20813;&#26410;&#23450;&#20041;&#34892;&#20026;&#12290;</p>
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">&#31034;&#20363;</span></h3>
<div class="t-example">
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;coroutine&gt;</span>
<span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;optional&gt;</span>
<span class="co2">#include &lt;ranges&gt;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> requires std<span class="sy4">::</span><span class="me2">movable</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span>
<span class="kw1">class</span> Generator <span class="br0">{</span>
<span class="kw1">public</span><span class="sy4">:</span>
<span class="kw1">struct</span> promise_type <span class="br0">{</span>
Generator<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> get_return_object<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">return</span> Generator<span class="br0">{</span>Handle<span class="sy4">::</span><span class="me2">from_promise</span><span class="br0">(</span><span class="sy2">*</span>this<span class="br0">)</span><span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw4">static</span> std<span class="sy4">::</span><span class="me2">suspend_always</span> initial_suspend<span class="br0">(</span><span class="br0">)</span> <span class="kw1">noexcept</span> <span class="br0">{</span>
<span class="kw1">return</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw4">static</span> std<span class="sy4">::</span><span class="me2">suspend_always</span> final_suspend<span class="br0">(</span><span class="br0">)</span> <span class="kw1">noexcept</span> <span class="br0">{</span>
<span class="kw1">return</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span>
std<span class="sy4">::</span><span class="me2">suspend_always</span> yield_value<span class="br0">(</span>T value<span class="br0">)</span> <span class="kw1">noexcept</span> <span class="br0">{</span>
current_value <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">move</span><span class="br0">(</span>value<span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">return</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="co1">// &#29983;&#25104;&#22120;&#21327;&#31243;&#20013;&#19981;&#20801;&#35768; co_await &#12290;</span>
<span class="kw4">void</span> await_transform<span class="br0">(</span><span class="br0">)</span> <span class="sy1">=</span> delete<span class="sy4">;</span>
<span class="kw4">static</span> <span class="kw4">void</span> unhandled_exception<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">throw</span><span class="sy4">;</span>
<span class="br0">}</span>
<a href="cpp-utility-optional.html"><span class="kw1075">std::<span class="me2">optional</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> current_value<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">using</span> Handle <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">coroutine_handle</span><span class="sy1">&lt;</span>promise_type<span class="sy1">&gt;</span><span class="sy4">;</span>
<span class="kw1">explicit</span> Generator<span class="br0">(</span>Handle coroutine<span class="br0">)</span> <span class="sy4">:</span>
m_coroutine<span class="br0">{</span>coroutine<span class="br0">}</span>
<span class="br0">{</span><span class="br0">}</span>
Generator<span class="br0">(</span><span class="br0">)</span> <span class="sy1">=</span> <span class="kw1">default</span><span class="sy4">;</span>
~Generator<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">if</span> <span class="br0">(</span>m_coroutine<span class="br0">)</span> <span class="br0">{</span>
m_coroutine.<span class="me1">destroy</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="br0">}</span>
Generator<span class="br0">(</span><span class="kw4">const</span> Generator<span class="sy3">&amp;</span><span class="br0">)</span> <span class="sy1">=</span> delete<span class="sy4">;</span>
Generator<span class="sy3">&amp;</span> operator<span class="sy1">=</span><span class="br0">(</span><span class="kw4">const</span> Generator<span class="sy3">&amp;</span><span class="br0">)</span> <span class="sy1">=</span> delete<span class="sy4">;</span>
Generator<span class="br0">(</span>Generator<span class="sy3">&amp;&amp;</span> other<span class="br0">)</span> <span class="kw1">noexcept</span> <span class="sy4">:</span>
m_coroutine<span class="br0">{</span>other.<span class="me1">m_coroutine</span><span class="br0">}</span>
<span class="br0">{</span>
other.<span class="me1">m_coroutine</span> <span class="sy1">=</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span>
Generator<span class="sy3">&amp;</span> operator<span class="sy1">=</span><span class="br0">(</span>Generator<span class="sy3">&amp;&amp;</span> other<span class="br0">)</span> <span class="kw1">noexcept</span> <span class="br0">{</span>
<span class="kw1">if</span> <span class="br0">(</span>this <span class="sy3">!</span><span class="sy1">=</span> <span class="sy3">&amp;</span>other<span class="br0">)</span> <span class="br0">{</span>
m_coroutine <span class="sy1">=</span> other.<span class="me1">m_coroutine</span><span class="sy4">;</span>
other.<span class="me1">m_coroutine</span> <span class="sy1">=</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw1">return</span> <span class="sy2">*</span>this<span class="sy4">;</span>
<span class="br0">}</span>
<span class="co1">// &#22522;&#20110;&#33539;&#22260;&#30340; for &#24490;&#29615;&#25903;&#25345;&#12290;</span>
<span class="kw1">class</span> Iter <span class="br0">{</span>
<span class="kw1">public</span><span class="sy4">:</span>
<span class="kw4">void</span> operator<span class="sy2">++</span><span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
m_coroutine.<span class="me1">resume</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw4">const</span> T<span class="sy3">&amp;</span> operator<span class="sy2">*</span><span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span> <span class="br0">{</span>
<span class="kw1">return</span> <span class="sy2">*</span>m_coroutine.<span class="me1">promise</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">current_value</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw4">bool</span> operator<span class="sy1">==</span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">default_sentinel_t</span><span class="br0">)</span> <span class="kw4">const</span> <span class="br0">{</span>
<span class="kw1">return</span> <span class="sy3">!</span>m_coroutine <span class="sy3">||</span> m_coroutine.<span class="me1">done</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw1">explicit</span> Iter<span class="br0">(</span>Handle coroutine<span class="br0">)</span> <span class="sy4">:</span>
m_coroutine<span class="br0">{</span>coroutine<span class="br0">}</span>
<span class="br0">{</span><span class="br0">}</span>
<span class="kw1">private</span><span class="sy4">:</span>
Handle m_coroutine<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
Iter begin<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">if</span> <span class="br0">(</span>m_coroutine<span class="br0">)</span> <span class="br0">{</span>
m_coroutine.<span class="me1">resume</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw1">return</span> Iter<span class="br0">{</span>m_coroutine<span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span>
std<span class="sy4">::</span><span class="me2">default_sentinel_t</span> end<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">return</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw1">private</span><span class="sy4">:</span>
Handle m_coroutine<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">integral</span> T<span class="sy1">&gt;</span>
Generator<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> range<span class="br0">(</span>T first, T last<span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">while</span> <span class="br0">(</span>first <span class="sy1">&lt;</span> last<span class="br0">)</span> <span class="br0">{</span>
co_yield first<span class="sy2">++</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="br0">}</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">int</span> i <span class="sy4">:</span> range<span class="br0">(</span><span class="sy2">-</span><span class="nu0">4</span>, <span class="nu0">8</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> i <span class="sy1">&lt;&lt;</span> <span class="st0">&#39; &#39;</span><span class="sy4">;</span>
<span class="br0">}</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">-4 -3 -2 -1 0 1 2 3 4 5 6 7</pre></div>
</div>
</div>
<h3><span class="mw-headline" id=".E7.BC.BA.E9.99.B7.E6.8A.A5.E5.91.8A">&#32570;&#38519;&#25253;&#21578;</span></h3>
<p>&#19979;&#21015;&#26356;&#25913;&#34892;&#20026;&#30340;&#32570;&#38519;&#25253;&#21578;&#36861;&#28335;&#22320;&#24212;&#29992;&#20110;&#20197;&#21069;&#20986;&#29256;&#30340; C++ &#26631;&#20934;&#12290;</p>
<table class="dsctable" style="font-size:0.8em">
<tr>
<th>DR</th>
<th>&#24212;&#29992;&#20110;</th>
<th>&#20986;&#29256;&#26102;&#30340;&#34892;&#20026;</th>
<th>&#27491;&#30830;&#34892;&#20026;</th>
</tr>
<tr>
<td><a rel="nofollow" class="external text" href="https://cplusplus.github.io/LWG/issue3460">LWG 3460</a></td>
<td>C++20</td>
<td><code>coroutine_handle</code> &#30340;&#20844;&#24320;&#22522;&#31867;&#33021;&#23558;&#23427;&#32622;&#20110;&#19981;&#24819;&#35201;&#30340;&#29366;&#24577;</td>
<td>&#31227;&#38500;&#32487;&#25215;</td>
</tr>
</table>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>