上传cppreference

This commit is contained in:
2025-08-01 12:57:54 +08:00
parent e29892f8cd
commit 196e706fe4
5485 changed files with 982007 additions and 3 deletions

View File

@@ -0,0 +1,303 @@
<!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>&#21327;&#31243; (C++20)</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_language_coroutines skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading">&#21327;&#31243; <span class="t-mark-rev t-since-cxx20">(C++20)</span></h1>
<div id="bodyContent">
<div id="contentSub"><span class="subpages">&lt; <a href="cpp.html">cpp</a>&lrm; | <a href="cpp-language.html">language</a></span></div>
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
<p>&#21327;&#31243;&#26159;&#33021;&#26242;&#20572;&#25191;&#34892;&#20197;&#22312;&#20043;&#21518;&#24674;&#22797;&#30340;&#20989;&#25968;&#12290;&#21327;&#31243;&#26159;&#26080;&#26632;&#30340;&#65306;&#23427;&#20204;&#36890;&#36807;&#36820;&#22238;&#21040;&#35843;&#29992;&#26041;&#26242;&#20572;&#25191;&#34892;&#65292;&#24182;&#19988;&#20174;&#26632;&#20998;&#31163;&#23384;&#20648;&#24674;&#22797;&#25191;&#34892;&#38656;&#35201;&#30340;&#25968;&#25454;&#12290;&#36825;&#26679;&#23601;&#21487;&#20197;&#32534;&#20889;&#24322;&#27493;&#25191;&#34892;&#30340;&#39034;&#24207;&#20195;&#30721;&#65288;&#20363;&#22914;&#19981;&#20351;&#29992;&#26174;&#24335;&#30340;&#22238;&#35843;&#26469;&#22788;&#29702;&#38750;&#38459;&#22622; I/O&#65289;&#65292;&#36824;&#25903;&#25345;&#23545;&#24816;&#24615;&#35745;&#31639;&#30340;&#26080;&#38480;&#24207;&#21015;&#19978;&#30340;&#31639;&#27861;&#21450;&#20854;&#20182;&#29992;&#36884;&#12290;</p>
<p>&#22914;&#26524;&#20989;&#25968;&#30340;&#23450;&#20041;&#36827;&#34892;&#20102;&#19979;&#21015;&#25805;&#20316;&#20043;&#19968;&#65292;&#37027;&#20040;&#23427;&#26159;&#21327;&#31243;&#65306;</p>
<ul>
<li>&#29992; <code>co_await</code> &#36816;&#31639;&#31526;&#26242;&#20572;&#25191;&#34892;&#65292;&#30452;&#21040;&#24674;&#22797;&#65306;</li>
</ul>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1">task<span class="sy1">&lt;&gt;</span> tcp_echo_server<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw4">char</span> data<span class="br0">[</span><span class="nu0">1024</span><span class="br0">]</span><span class="sy4">;</span>
<span class="kw1">while</span> <span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span> <span class="br0">{</span>
<a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> n <span class="sy1">=</span> co_await socket.<span class="me1">async_read_some</span><span class="br0">(</span>buffer<span class="br0">(</span>data<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
co_await async_write<span class="br0">(</span>socket, buffer<span class="br0">(</span>data, n<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="br0">}</span></pre></div>
</div>
<ul>
<li>&#29992;&#20851;&#38190;&#35789; <code>co_yield</code> &#26242;&#20572;&#25191;&#34892;&#24182;&#36820;&#22238;&#19968;&#20010;&#20540;&#65306;</li>
</ul>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1">generator<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> iota<span class="br0">(</span><span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">0</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">while</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span>
co_yield n<span class="sy2">++</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<ul>
<li>&#29992;&#20851;&#38190;&#35789; <span class="t-lc">co_return</span> &#23436;&#25104;&#25191;&#34892;&#24182;&#36820;&#22238;&#19968;&#20010;&#20540;&#65306;</li>
</ul>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1">lazy<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> f<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
co_return <span class="nu0">7</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#27599;&#20010;&#21327;&#31243;&#24517;&#39035;&#20855;&#26377;&#33021;&#22815;&#28385;&#36275;&#19968;&#32452;&#35201;&#27714;&#30340;&#36820;&#22238;&#31867;&#22411;&#65292;&#26631;&#27880;&#20110;&#19979;&#12290;</p>
<h3><span class="mw-headline" id=".E9.99.90.E5.88.B6">&#38480;&#21046;</span></h3>
<p>&#21327;&#31243;&#19981;&#33021;&#20351;&#29992;<a href="cpp-language-variadic_arguments.html">&#21464;&#38271;&#23454;&#21442;</a>&#65292;&#26222;&#36890;&#30340; <a href="cpp-language-return.html">return</a> &#35821;&#21477;&#65292;&#25110;<a href="cpp-language-function.html">&#21344;&#20301;&#31526;&#36820;&#22238;&#31867;&#22411;</a>&#65288;<a href="cpp-language-auto.html"><code>auto</code></a> &#25110; <code>Concept</code>&#65289;&#12290;</p>
<p><a href="cpp-language-constexpr.html">constexpr &#20989;&#25968;</a>&#12289;<a href="cpp-language-constructor.html">&#26500;&#36896;&#20989;&#25968;</a>&#12289;<a href="cpp-language-destructor.html">&#26512;&#26500;&#20989;&#25968;</a>&#21450; <a href="cpp-language-main_function.html"><code>main</code> &#20989;&#25968;</a> &#19981;&#33021;&#26159;&#21327;&#31243;&#12290;</p>
<h3><span class="mw-headline" id=".E6.89.A7.E8.A1.8C">&#25191;&#34892;</span></h3>
<p>&#27599;&#20010;&#21327;&#31243;&#22343;&#19982;&#19979;&#21015;&#23545;&#35937;&#20851;&#32852;&#65306;</p>
<ul>
<li><i>&#25215;&#35834;&#65288;promise&#65289;&#23545;&#35937;</i>&#65292;&#20174;&#21327;&#31243;&#20869;&#37096;&#25805;&#32437;&#12290;&#21327;&#31243;&#36890;&#36807;&#27492;&#23545;&#35937;&#25552;&#20132;&#20854;&#32467;&#26524;&#25110;&#24322;&#24120;&#12290;</li>
<li><i>&#21327;&#31243;&#21477;&#26564; (coroutine handle)</i>&#65292;&#20174;&#21327;&#31243;&#22806;&#37096;&#25805;&#32437;&#12290;&#36825;&#26159;&#29992;&#20110;&#24674;&#22797;&#21327;&#31243;&#25191;&#34892;&#25110;&#38144;&#27585;&#21327;&#31243;&#24103;&#30340;&#38750;&#25317;&#26377;&#26564;&#12290;</li>
<li><i>&#21327;&#31243;&#29366;&#24577; (coroutine state)</i>&#65292;&#23427;&#26159;&#19968;&#20010;&#21253;&#21547;&#20197;&#19979;&#21508;&#39033;&#30340;&#20998;&#37197;&#20110;&#22534;&#65288;&#38500;&#38750;&#20248;&#21270;&#25481;&#20854;&#20998;&#37197;&#65289;&#30340;&#20869;&#37096;&#23545;&#35937;&#65306;</li>
</ul>
<dl>
<dd>
<ul>
<li>&#25215;&#35834;&#23545;&#35937;</li>
<li>&#21508;&#20010;&#24418;&#21442;&#65288;&#20840;&#37096;&#25353;&#20540;&#22797;&#21046;&#65289;</li>
<li>&#24403;&#21069;&#26242;&#20572;&#28857;&#30340;&#26576;&#31181;&#34920;&#31034;&#65292;&#20351;&#24471;&#24674;&#22797;&#26102;&#31243;&#24207;&#30693;&#26195;&#35201;&#20174;&#20309;&#22788;&#32487;&#32493;&#65292;&#38144;&#27585;&#26102;&#30693;&#26195;&#26377;&#21738;&#20123;&#23616;&#37096;&#21464;&#37327;&#22312;&#20316;&#29992;&#22495;&#20869;</li>
<li>&#29983;&#23384;&#26399;&#36328;&#36807;&#24403;&#21069;&#26242;&#20572;&#28857;&#30340;&#23616;&#37096;&#21464;&#37327;&#21644;&#20020;&#26102;&#37327;</li>
</ul>
</dd>
</dl>
<p>&#24403;&#21327;&#31243;&#24320;&#22987;&#25191;&#34892;&#26102;&#65292;&#23427;&#36827;&#34892;&#19979;&#21015;&#25805;&#20316;&#65306;</p>
<ul>
<li>&#29992; <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-new-operator_new.html"><span class="kw687">operator new</span></a></span></span> &#20998;&#37197;&#21327;&#31243;&#29366;&#24577;&#23545;&#35937;&#65288;&#35265;&#19979;&#25991;&#65289;</li>
<li>&#23558;&#25152;&#26377;&#20989;&#25968;&#24418;&#21442;&#22797;&#21046;&#21040;&#21327;&#31243;&#29366;&#24577;&#20013;&#65306;&#25353;&#20540;&#20256;&#36882;&#30340;&#24418;&#21442;&#34987;&#31227;&#21160;&#25110;&#22797;&#21046;&#65292;&#25353;&#24341;&#29992;&#20256;&#36882;&#30340;&#21442;&#25968;&#20445;&#25345;&#20026;&#24341;&#29992;&#65288;&#22240;&#27492;&#65292;&#22914;&#26524;&#22312;&#34987;&#25351;&#20195;&#23545;&#35937;&#30340;&#29983;&#23384;&#26399;&#32467;&#26463;&#21518;&#24674;&#22797;&#21327;&#31243;&#65292;&#23427;&#21487;&#33021;&#21464;&#25104;&#24748;&#22402;&#24341;&#29992;&#65289;</li>
<li>&#35843;&#29992;&#25215;&#35834;&#23545;&#35937;&#30340;&#26500;&#36896;&#20989;&#25968;&#12290;&#22914;&#26524;&#25215;&#35834;&#31867;&#22411;&#25317;&#26377;&#25509;&#25910;&#25152;&#26377;&#21327;&#31243;&#24418;&#21442;&#30340;&#26500;&#36896;&#20989;&#25968;&#65292;&#37027;&#20040;&#20197;&#22797;&#21046;&#21518;&#30340;&#21327;&#31243;&#23454;&#21442;&#35843;&#29992;&#35813;&#26500;&#36896;&#20989;&#25968;&#12290;&#21542;&#21017;&#35843;&#29992;&#20854;&#40664;&#35748;&#26500;&#36896;&#20989;&#25968;&#12290;</li>
<li>&#35843;&#29992; <span class="t-c"><span class="mw-geshi cpp source-cpp">promise.<span class="me1">get_return_object</span><span class="br0">(</span><span class="br0">)</span></span></span> &#24182;&#23558;&#20854;&#32467;&#26524;&#22312;&#23616;&#37096;&#21464;&#37327;&#20013;&#20445;&#25345;&#12290;&#35813;&#35843;&#29992;&#30340;&#32467;&#26524;&#23558;&#22312;&#21327;&#31243;&#39318;&#27425;&#26242;&#20572;&#26102;&#36820;&#22238;&#32473;&#35843;&#29992;&#26041;&#12290;&#33267;&#27492;&#24182;&#21253;&#21547;&#36825;&#20010;&#27493;&#39588;&#20026;&#27490;&#65292;&#20219;&#20309;&#25243;&#20986;&#30340;&#24322;&#24120;&#22343;&#20256;&#25773;&#22238;&#35843;&#29992;&#26041;&#65292;&#32780;&#38750;&#32622;&#20110;&#25215;&#35834;&#20013;&#12290;</li>
<li>&#35843;&#29992; <span class="t-c"><span class="mw-geshi cpp source-cpp">promise.<span class="me1">initial_suspend</span><span class="br0">(</span><span class="br0">)</span></span></span> &#24182; <span class="t-c"><span class="mw-geshi cpp source-cpp">co_await</span></span> &#20854;&#32467;&#26524;&#12290;&#20856;&#22411;&#30340;&#25215;&#35834;&#31867;&#22411;&#35201;&#20040;&#65288;&#23545;&#20110;&#24816;&#24615;&#21551;&#21160;&#30340;&#21327;&#31243;&#65289;&#36820;&#22238; <span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">suspend_always</span></span></span>&#65292;&#35201;&#20040;&#65288;&#23545;&#20110;&#24613;&#20999;&#21551;&#21160;&#30340;&#21327;&#31243;&#65289;&#36820;&#22238; <span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">suspend_never</span></span></span>&#12290;</li>
<li>&#24403; <span class="t-c"><span class="mw-geshi cpp source-cpp">co_await promise.<span class="me1">initial_suspend</span><span class="br0">(</span><span class="br0">)</span></span></span> &#24674;&#22797;&#26102;&#65292;&#24320;&#22987;&#21327;&#31243;&#20307;&#30340;&#25191;&#34892;&#12290;</li>
</ul>
<p>&#24403;&#21327;&#31243;&#25269;&#36798;&#26242;&#20572;&#28857;&#26102;&#65306;</p>
<ul>
<li>&#23558;&#20808;&#21069;&#33719;&#24471;&#30340;&#36820;&#22238;&#23545;&#35937;&#36820;&#22238;&#32473;&#35843;&#29992;&#26041;/&#24674;&#22797;&#26041;&#65292;&#22914;&#26524;&#38656;&#35201;&#21017;&#20808;&#38544;&#24335;&#36716;&#25442;&#21040;&#21327;&#31243;&#30340;&#36820;&#22238;&#31867;&#22411;&#12290;</li>
</ul>
<p>&#24403;&#21327;&#31243;&#25269;&#36798; <span class="t-c"><span class="mw-geshi cpp source-cpp">co_return</span></span> &#35821;&#21477;&#26102;&#65292;&#23427;&#36827;&#34892;&#19979;&#21015;&#25805;&#20316;&#65306;</p>
<ul>
<li>&#23545;&#19979;&#21015;&#24773;&#24418;&#35843;&#29992; <span class="t-c"><span class="mw-geshi cpp source-cpp">promise.<span class="me1">return_void</span><span class="br0">(</span><span class="br0">)</span></span></span></li>
</ul>
<dl>
<dd>
<ul>
<li><span class="t-c"><span class="mw-geshi cpp source-cpp">co_return<span class="sy4">;</span></span></span></li>
<li><span class="t-c"><span class="mw-geshi cpp source-cpp">co_return expr</span></span>&#65292;&#20854;&#20013; expr &#20855;&#26377; void &#31867;&#22411;</li>
<li>&#25511;&#21046;&#27969;&#20986;&#36820;&#22238; void &#30340;&#21327;&#31243;&#30340;&#32467;&#23614;&#12290;&#27492;&#26102;&#22914;&#26524;&#25215;&#35834;&#31867;&#22411; Promise &#27809;&#26377; <span class="t-c"><span class="mw-geshi cpp source-cpp">Promise<span class="sy4">::</span><span class="me2">return_void</span><span class="br0">(</span><span class="br0">)</span></span></span> &#25104;&#21592;&#20989;&#25968;&#65292;&#37027;&#20040;&#21017;&#34892;&#20026;&#26410;&#23450;&#20041;&#12290;</li>
</ul>
</dd>
</dl>
<ul>
<li>&#25110;&#23545;&#20110; <span class="t-c"><span class="mw-geshi cpp source-cpp">co_return expr</span></span> &#35843;&#29992; <span class="t-c"><span class="mw-geshi cpp source-cpp">promise.<span class="me1">return_value</span><span class="br0">(</span>expr<span class="br0">)</span></span></span>&#65292;&#20854;&#20013; expr &#20855;&#26377;&#38750; void &#31867;&#22411;</li>
<li>&#20197;&#21019;&#24314;&#30340;&#36870;&#24207;&#38144;&#27585;&#25152;&#26377;&#20855;&#26377;&#33258;&#21160;&#23384;&#20648;&#26399;&#30340;&#21464;&#37327;&#12290;</li>
<li>&#35843;&#29992; <span class="t-c"><span class="mw-geshi cpp source-cpp">promise.<span class="me1">final_suspend</span><span class="br0">(</span><span class="br0">)</span></span></span> &#24182; <span class="t-c"><span class="mw-geshi cpp source-cpp">co_await</span></span> &#20854;&#32467;&#26524;&#12290;</li>
</ul>
<p>&#22914;&#26524;&#21327;&#31243;&#22240;&#26410;&#25429;&#25417;&#30340;&#24322;&#24120;&#32467;&#26463;&#65292;&#37027;&#20040;&#23427;&#36827;&#34892;&#19979;&#21015;&#25805;&#20316;&#65306;</p>
<ul>
<li>&#25429;&#25417;&#24322;&#24120;&#24182;&#22312; catch &#22359;&#20869;&#35843;&#29992; <span class="t-c"><span class="mw-geshi cpp source-cpp">promise.<span class="me1">unhandled_exception</span><span class="br0">(</span><span class="br0">)</span></span></span></li>
<li>&#35843;&#29992; <span class="t-c"><span class="mw-geshi cpp source-cpp">promise.<span class="me1">final_suspend</span><span class="br0">(</span><span class="br0">)</span></span></span> &#24182; <span class="t-c"><span class="mw-geshi cpp source-cpp">co_await</span></span> &#20854;&#32467;&#26524;&#65288;&#20363;&#22914;&#65292;&#20197;&#24674;&#22797;&#26576;&#20010;&#32487;&#32493;&#25110;&#21457;&#24067;&#20854;&#32467;&#26524;&#65289;&#12290;&#27492;&#26102;&#24320;&#22987;&#24674;&#22797;&#21327;&#31243;&#26159;&#26410;&#23450;&#20041;&#34892;&#20026;&#12290;</li>
</ul>
<p>&#24403;&#32463;&#30001; <code>co_return</code> &#25110;&#26410;&#25429;&#25417;&#24322;&#24120;&#32780;&#32456;&#27490;&#21327;&#31243;&#23548;&#33268;&#21327;&#31243;&#29366;&#24577;&#34987;&#38144;&#27585;&#65292;&#25110;&#32463;&#30001;&#20854;&#21477;&#26564;&#32780;&#23548;&#33268;&#20854;&#34987;&#38144;&#27585;&#26102;&#65292;&#23427;&#36827;&#34892;&#19979;&#21015;&#25805;&#20316;&#65306;</p>
<ul>
<li>&#35843;&#29992;&#25215;&#35834;&#23545;&#35937;&#30340;&#26512;&#26500;&#20989;&#25968;&#12290;</li>
<li>&#35843;&#29992;&#21508;&#20010;&#20989;&#25968;&#24418;&#21442;&#21103;&#26412;&#30340;&#26512;&#26500;&#20989;&#25968;&#12290;</li>
<li>&#35843;&#29992; <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-new-operator_delete.html"><span class="kw689">operator delete</span></a></span></span> &#20197;&#37322;&#25918;&#21327;&#31243;&#29366;&#24577;&#25152;&#29992;&#30340;&#20869;&#23384;&#12290;</li>
<li>&#36716;&#31227;&#25191;&#34892;&#22238;&#21040;&#35843;&#29992;&#26041;/&#24674;&#22797;&#26041;&#12290;</li>
</ul>
<h3><span class="mw-headline" id=".E5.A0.86.E5.88.86.E9.85.8D">&#22534;&#20998;&#37197;</span></h3>
<p>&#21327;&#31243;&#29366;&#24577;&#30001;&#38750;&#25968;&#32452; <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-new-operator_new.html"><span class="kw687">operator new</span></a></span></span> &#22312;&#22534;&#19978;&#20998;&#37197;&#12290;</p>
<p>&#22914;&#26524;&#25215;&#35834;&#31867;&#22411;&#23450;&#20041;&#20102;&#31867;&#32423;&#21035;&#30340;&#26367;&#20195;&#20989;&#25968;&#65292;&#37027;&#20040;&#20250;&#20351;&#29992;&#23427;&#65292;&#21542;&#21017;&#20250;&#20351;&#29992;&#20840;&#23616;&#30340; <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-new-operator_new.html"><span class="kw687">operator new</span></a></span></span>&#12290;</p>
<p>&#22914;&#26524;&#25215;&#35834;&#31867;&#22411;&#23450;&#20041;&#20102;&#25509;&#25910;&#39069;&#22806;&#24418;&#21442;&#30340; <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-new-operator_new.html"><span class="kw687">operator new</span></a></span></span> &#30340;&#24067;&#32622;&#24418;&#24335;&#65292;&#19988;&#23427;&#20204;&#25152;&#21305;&#37197;&#30340;&#23454;&#21442;&#21015;&#34920;&#20013;&#30340;&#31532;&#19968;&#23454;&#21442;&#26159;&#35201;&#27714;&#30340;&#22823;&#23567;&#65288;<span class="t-lc"><a href="cpp-types-size_t.html">std::size_t</a></span> &#31867;&#22411;&#65289;&#65292;&#32780;&#20854;&#20313;&#21017;&#26159;&#21508;&#20010;&#21327;&#31243;&#20989;&#25968;&#23454;&#21442;&#65292;&#37027;&#20040;&#23558;&#36825;&#20123;&#23454;&#21442;&#20256;&#36882;&#32473; <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-new-operator_new.html"><span class="kw687">operator new</span></a></span></span>&#65288;&#36825;&#20351;&#24471;&#33021;&#23545;&#21327;&#31243;&#20351;&#29992;<a href="cpp-memory-uses_allocator.html#.E4.BD.BF.E7.94.A8.E5.88.86.E9.85.8D.E5.99.A8.E6.9E.84.E9.80.A0">&#21069;&#23548;&#20998;&#37197;&#22120;&#32422;&#23450;</a>&#65289;</p>
<p>&#20197;&#19979;&#24773;&#20917;&#19979;&#65292;&#21487;&#20197;&#20248;&#21270;&#25481;&#23545; <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-new-operator_new.html"><span class="kw687">operator new</span></a></span></span> &#30340;&#35843;&#29992;&#65288;&#21363;&#20351;&#20351;&#29992;&#20102;&#33258;&#23450;&#20041;&#20998;&#37197;&#22120;&#65289;&#65306;</p>
<ul>
<li>&#21327;&#31243;&#29366;&#24577;&#30340;&#29983;&#23384;&#26399;&#20005;&#26684;&#20869;&#23884;&#20110;&#35843;&#29992;&#26041;&#30340;&#29983;&#23384;&#26399;&#65292;&#19988;</li>
<li>&#21327;&#31243;&#24103;&#30340;&#22823;&#23567;&#22312;&#35843;&#29992;&#28857;&#24050;&#30693;</li>
</ul>
<p>&#27492;&#26102;&#21327;&#31243;&#29366;&#24577;&#23884;&#20837;&#35843;&#29992;&#26041;&#30340;&#26632;&#24103;&#65288;&#22914;&#26524;&#35843;&#29992;&#26041;&#26159;&#26222;&#36890;&#20989;&#25968;&#65289;&#25110;&#21327;&#31243;&#29366;&#24577;&#65288;&#22914;&#26524;&#35843;&#29992;&#26041;&#26159;&#21327;&#31243;&#65289;&#20043;&#20013;&#12290;</p>
<p>&#22914;&#26524;&#20998;&#37197;&#22833;&#36133;&#65292;&#37027;&#20040;&#21327;&#31243;&#25243;&#20986; <span class="t-lc"><a href="cpp-memory-new-bad_alloc.html">std::bad_alloc</a></span>&#65292;&#38500;&#38750;&#25215;&#35834;&#31867;&#22411; Promise &#31867;&#22411;&#23450;&#20041;&#20102;&#25104;&#21592;&#20989;&#25968; <span class="t-c"><span class="mw-geshi cpp source-cpp">Promise<span class="sy4">::</span><span class="me2">get_return_object_on_allocation_failure</span><span class="br0">(</span><span class="br0">)</span></span></span>&#12290;&#22914;&#26524;&#23450;&#20041;&#20102;&#35813;&#25104;&#21592;&#20989;&#25968;&#65292;&#37027;&#20040;&#20351;&#29992; <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-new-operator_new.html"><span class="kw687">operator new</span></a></span></span> &#30340; <span class="t-c"><span class="mw-geshi cpp source-cpp">nothrow</span></span> &#24418;&#24335;&#36827;&#34892;&#20998;&#37197;&#65292;&#32780;&#22312;&#20998;&#37197;&#22833;&#36133;&#26102;&#65292;&#21327;&#31243;&#20250;&#31435;&#21363;&#23558;&#20174; <span class="t-c"><span class="mw-geshi cpp source-cpp">Promise<span class="sy4">::</span><span class="me2">get_return_object_on_allocation_failure</span><span class="br0">(</span><span class="br0">)</span></span></span> &#33719;&#24471;&#30340;&#23545;&#35937;&#36820;&#22238;&#32473;&#35843;&#29992;&#26041;&#12290;</p>
<h3><span class="mw-headline" id=".E6.89.BF.E8.AF.BA.E7.B1.BB.E5.9E.8B.EF.BC.88Promise.EF.BC.89">&#25215;&#35834;&#31867;&#22411;&#65288;<span class="t-c"><span class="mw-geshi cpp source-cpp">Promise</span></span>&#65289;</span></h3>
<p>&#32534;&#35793;&#22120;&#29992; <span class="t-lc">std::coroutine_traits</span> &#20174;&#21327;&#31243;&#30340;&#36820;&#22238;&#31867;&#22411;&#30830;&#23450;&#25215;&#35834;&#31867;&#22411;&#12290;</p>
<p>&#27491;&#24335;&#32780;&#35328;&#65292;&#20196; <code>R</code> &#19982; <code>Args...</code> &#20998;&#21035;&#20195;&#34920;&#21327;&#31243;&#30340;&#36820;&#22238;&#31867;&#22411;&#19982;&#21442;&#25968;&#31867;&#22411;&#21015;&#34920;&#65292;<code>ClassT</code> &#19982; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="coMULTI">/*cv&#38480;&#23450;*/</span></span></span> &#65288;&#22914;&#26524;&#23384;&#22312;&#65289;&#20998;&#21035;&#20195;&#34920;&#21327;&#31243;&#25152;&#23646;&#30340;&#31867;&#19982;&#20854; cv &#38480;&#23450;&#65292;&#22914;&#26524;&#23450;&#20041;&#23427;&#20026;&#38750;&#38745;&#24577;&#25104;&#21592;&#20989;&#25968;&#65292;&#20197;&#22914;&#19979;&#26041;&#24335;&#30830;&#23450;&#23427;&#30340;&#25215;&#35834;&#31867;&#22411; &#65306;</p>
<ul>
<li><span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">coroutine_traits</span><span class="sy1">&lt;</span>R, Args...<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">promise_type</span></span></span>&#65292;&#22914;&#26524;&#19981;&#23450;&#20041;&#21327;&#31243;&#20026;&#38750;&#38745;&#24577;&#25104;&#21592;&#20989;&#25968;&#65292;</li>
<li><span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">coroutine_traits</span><span class="sy1">&lt;</span>R, ClassT <span class="coMULTI">/*cv&#38480;&#23450;*/</span><span class="sy3">&amp;</span>, Args...<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">promise_type</span></span></span>&#65292;&#22914;&#26524;&#23450;&#20041;&#21327;&#31243;&#20026;&#38750;&#21491;&#20540;&#24341;&#29992;&#38480;&#23450;&#30340;&#38750;&#38745;&#24577;&#25104;&#21592;&#20989;&#25968;&#65292;</li>
<li><span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">coroutine_traits</span><span class="sy1">&lt;</span>R, ClassT <span class="coMULTI">/*cv&#38480;&#23450;*/</span><span class="sy3">&amp;&amp;</span>, Args...<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">promise_type</span></span></span>&#65292;&#22914;&#26524;&#23450;&#20041;&#21327;&#31243;&#20026;&#21491;&#20540;&#24341;&#29992;&#38480;&#23450;&#30340;&#38750;&#38745;&#24577;&#25104;&#21592;&#20989;&#25968;&#12290;</li>
</ul>
<p>&#20363;&#22914;&#65306;</p>
<ul>
<li>&#22914;&#26524;&#23450;&#20041;&#21327;&#31243;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp">task<span class="sy1">&lt;</span><span class="kw4">float</span><span class="sy1">&gt;</span> foo<span class="br0">(</span><a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a> x, <span class="kw4">bool</span> flag<span class="br0">)</span><span class="sy4">;</span></span></span>&#65292;&#37027;&#20040;&#23427;&#30340;&#25215;&#35834;&#31867;&#22411;&#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">coroutine_traits</span><span class="sy1">&lt;</span>task<span class="sy1">&lt;</span><span class="kw4">float</span><span class="sy1">&gt;</span>, <a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a>, <span class="kw4">bool</span><span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">promise_type</span></span></span>&#12290;</li>
<li>&#22914;&#26524;&#23450;&#20041;&#21327;&#31243;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp">task<span class="sy1">&lt;</span><span class="kw4">void</span><span class="sy1">&gt;</span> my_class<span class="sy4">::</span><span class="me2">method1</span><span class="br0">(</span><span class="kw4">int</span> x<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span>&#65292;&#37027;&#20040;&#23427;&#30340;&#25215;&#35834;&#31867;&#22411;&#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">coroutine_traits</span><span class="sy1">&lt;</span>task<span class="sy1">&lt;</span><span class="kw4">void</span><span class="sy1">&gt;</span>, <span class="kw4">const</span> my_class<span class="sy3">&amp;</span>, <span class="kw4">int</span><span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">promise_type</span></span></span>&#12290;</li>
<li>&#22914;&#26524;&#23450;&#20041;&#21327;&#31243;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp">task<span class="sy1">&lt;</span><span class="kw4">void</span><span class="sy1">&gt;</span> my_class<span class="sy4">::</span><span class="me2">method1</span><span class="br0">(</span><span class="kw4">int</span> x<span class="br0">)</span> <span class="sy3">&amp;&amp;</span><span class="sy4">;</span></span></span>&#65292;&#37027;&#20040;&#23427;&#30340;&#25215;&#35834;&#31867;&#22411;&#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">coroutine_traits</span><span class="sy1">&lt;</span>task<span class="sy1">&lt;</span><span class="kw4">void</span><span class="sy1">&gt;</span>, my_class<span class="sy3">&amp;&amp;</span>, <span class="kw4">int</span><span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">promise_type</span></span></span>&#12290;</li>
</ul>
<h3><span class="mw-headline" id="co_await">co_await</span></h3>
<p>&#19968;&#20803;&#36816;&#31639;&#31526; <span class="t-c"><span class="mw-geshi cpp source-cpp">co_await</span></span> &#26242;&#20572;&#21327;&#31243;&#24182;&#23558;&#25511;&#21046;&#36820;&#22238;&#32473;&#35843;&#29992;&#26041;&#12290;&#23427;&#30340;&#25805;&#20316;&#25968;&#26159;&#19968;&#20010;&#34920;&#36798;&#24335;&#65292;&#20854;&#31867;&#22411;&#24517;&#39035;&#35201;&#20040;&#23450;&#20041; <span class="t-c"><span class="mw-geshi cpp source-cpp">operator co_await</span></span>&#65292;&#35201;&#20040;&#33021;&#20197;&#24403;&#21069;&#21327;&#31243;&#30340; <span class="t-c"><span class="mw-geshi cpp source-cpp">Promise<span class="sy4">::</span><span class="me2">await_transform</span></span></span> &#36716;&#25442;&#21040;&#36825;&#31181;&#31867;&#22411;&#12290;</p>
<table class="t-sdsc-begin">
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td class="t-sdsc-nopad"><code><b>co_await</b></code> <span class="t-spar">&#34920;&#36798;&#24335;</span></td>
<td class="t-sdsc-nopad"></td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
</table>
<p>&#39318;&#20808;&#65292;&#20197;&#19979;&#21015;&#26041;&#24335;&#23558; <span class="t-spar">&#34920;&#36798;&#24335;</span> &#36716;&#25442;&#25104;&#21487;&#31561;&#24453;&#20307;&#65288;awaitable&#65289;&#65306;</p>
<ul>
<li>&#22914;&#26524; <span class="t-spar">&#34920;&#36798;&#24335;</span> &#30001;&#21021;&#22987;&#26242;&#20572;&#28857;&#12289;&#26368;&#32456;&#26242;&#20572;&#28857;&#25110; yield &#34920;&#36798;&#24335;&#25152;&#20135;&#29983;&#65292;&#37027;&#20040;&#21487;&#31561;&#24453;&#20307;&#26159; <span class="t-spar">&#34920;&#36798;&#24335;</span> &#26412;&#36523;&#12290;</li>
<li>&#21542;&#21017;&#65292;&#22914;&#26524;&#24403;&#21069;&#21327;&#31243;&#30340;&#25215;&#35834;&#31867;&#22411;&#25317;&#26377;&#25104;&#21592;&#20989;&#25968; <span class="t-c"><span class="mw-geshi cpp source-cpp">await_transform</span></span>&#65292;&#37027;&#20040;&#21487;&#31561;&#24453;&#20307;&#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp">promise.<span class="me1">await_transform</span><span class="br0">(</span>&#34920;&#36798;&#24335;<span class="br0">)</span></span></span>&#12290;</li>
<li>&#21542;&#21017;&#65292;&#21487;&#31561;&#24453;&#20307;&#26159; <span class="t-spar">&#34920;&#36798;&#24335;</span> &#26412;&#36523;&#12290;</li>
</ul>
<p>&#28982;&#21518;&#20197;&#19979;&#21015;&#26041;&#24335;&#33719;&#24471;&#31561;&#24453;&#22120;&#65288;awaiter&#65289;&#23545;&#35937;&#65306;</p>
<ul>
<li>&#22914;&#26524;&#38024;&#23545; <span class="t-c"><span class="mw-geshi cpp source-cpp">operator co_await</span></span> &#30340;&#37325;&#36733;&#20915;&#35758;&#32473;&#20986;&#21333;&#20010;&#26368;&#20339;&#37325;&#36733;&#65292;&#37027;&#20040;&#31561;&#24453;&#22120;&#26159;&#35813;&#35843;&#29992;&#30340;&#32467;&#26524;&#65288;&#23545;&#20110;&#25104;&#21592;&#37325;&#36733;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp">awaitable.<span class="me1">operator</span> co_await<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span></span></span>&#65292;&#23545;&#20110;&#38750;&#25104;&#21592;&#37325;&#36733;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp">operator co_await<span class="br0">(</span><span class="kw1">static_cast</span><span class="sy1">&lt;</span>Awaitable<span class="sy3">&amp;&amp;</span><span class="sy1">&gt;</span><span class="br0">(</span>awaitable<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span></span></span>&#65289;</li>
<li>&#21542;&#21017;&#65292;&#22914;&#26524;&#37325;&#36733;&#20915;&#35758;&#25214;&#19981;&#21040; <code>operator co_await</code>&#65292;&#37027;&#20040;&#31561;&#24453;&#22120;&#26159;&#21487;&#31561;&#24453;&#20307;&#26412;&#36523;</li>
<li>&#21542;&#21017;&#65292;&#22914;&#26524;&#37325;&#36733;&#20915;&#35758;&#26377;&#27495;&#20041;&#65292;&#37027;&#20040;&#31243;&#24207;&#38750;&#33391;&#26500;</li>
</ul>
<p>&#22914;&#26524;&#19978;&#36848;&#34920;&#36798;&#24335;&#20026;&#32431;&#21491;&#20540;&#65292;&#37027;&#20040;&#31561;&#24453;&#22120;&#23545;&#35937;&#26159;&#20174;&#23427;<a href="cpp-language-implicit_conversion.html#.E4.B8.B4.E6.97.B6.E9.87.8F.E5.AE.9E.E8.B4.A8.E5.8C.96">&#23454;&#36136;&#21270;</a>&#30340;&#20020;&#26102;&#37327;&#12290;&#21542;&#21017;&#65292;&#22914;&#26524;&#19978;&#36848;&#34920;&#36798;&#24335;&#20026;&#27867;&#24038;&#20540;&#65292;&#37027;&#20040;&#31561;&#24453;&#22120;&#23545;&#35937;&#26159;&#23427;&#25152;&#25351;&#20195;&#30340;&#23545;&#35937;&#12290;</p>
<p>&#28982;&#21518;&#65292;&#35843;&#29992; <span class="t-c"><span class="mw-geshi cpp source-cpp">awaiter.<span class="me1">await_ready</span><span class="br0">(</span><span class="br0">)</span></span></span>&#65288;&#36825;&#26159;&#24403;&#24050;&#30693;&#32467;&#26524;&#23601;&#32490;&#25110;&#21487;&#20197;&#21516;&#27493;&#23436;&#25104;&#26102;&#65292;&#29992;&#20197;&#36991;&#20813;&#26242;&#20572;&#24320;&#38144;&#30340;&#24555;&#25463;&#26041;&#24335;&#65289;&#12290;&#22914;&#26524;&#23427;&#30340;&#32467;&#26524;&#25353;&#35821;&#22659;&#36716;&#25442;&#25104; <code>bool</code> &#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span>&#65292;&#37027;&#20040;&#65306;</p>
<dl>
<dd>&#26242;&#20572;&#21327;&#31243;&#65288;&#20197;&#21508;&#23616;&#37096;&#21464;&#37327;&#21644;&#24403;&#21069;&#26242;&#20572;&#28857;&#22635;&#20805;&#20854;&#21327;&#31243;&#29366;&#24577;&#65289;&#12290;</dd>
<dd>&#35843;&#29992; <span class="t-c"><span class="mw-geshi cpp source-cpp">awaiter.<span class="me1">await_suspend</span><span class="br0">(</span>handle<span class="br0">)</span></span></span>&#65292;&#20854;&#20013; handle &#26159;&#34920;&#31034;&#24403;&#21069;&#21327;&#31243;&#30340;&#21327;&#31243;&#21477;&#26564;&#12290;&#36825;&#20010;&#20989;&#25968;&#20869;&#37096;&#21487;&#20197;&#36890;&#36807;&#36825;&#20010;&#21477;&#26564;&#35266;&#23519;&#26242;&#20572;&#30340;&#21327;&#31243;&#65292;&#32780;&#19988;&#27492;&#20989;&#25968;&#36127;&#36131;&#35843;&#24230;&#23427;&#20197;&#22312;&#26576;&#20010;&#25191;&#34892;&#22120;&#19978;&#24674;&#22797;&#65292;&#25110;&#23558;&#20854;&#38144;&#27585;&#65288;&#24182;&#36820;&#22238; <code>false</code> &#24403;&#20570;&#35843;&#24230;&#65289;
<ul>
<li>&#22914;&#26524; <code>await_suspend</code> &#36820;&#22238; <code>void</code>&#65292;&#37027;&#20040;&#31435;&#21363;&#23558;&#25511;&#21046;&#36820;&#22238;&#32473;&#24403;&#21069;&#21327;&#31243;&#30340;&#35843;&#29992;&#26041;/&#24674;&#22797;&#26041;&#65288;&#27492;&#21327;&#31243;&#20445;&#25345;&#26242;&#20572;&#65289;&#65292;&#21542;&#21017;</li>
<li>&#22914;&#26524; <code>await_suspend</code> &#36820;&#22238; <code>bool</code>&#65292;&#37027;&#20040;&#65306;</li>
</ul>
<dl>
<dd>
<ul>
<li>&#20540;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> &#26102;&#23558;&#25511;&#21046;&#36820;&#22238;&#32473;&#24403;&#21069;&#21327;&#31243;&#30340;&#35843;&#29992;&#26041;/&#24674;&#22797;&#26041;</li>
<li>&#20540;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span> &#26102;&#24674;&#22797;&#24403;&#21069;&#21327;&#31243;&#12290;</li>
</ul>
</dd>
</dl>
<ul>
<li>&#22914;&#26524; <code>await_suspend</code> &#36820;&#22238;&#26576;&#20010;&#20854;&#20182;&#21327;&#31243;&#30340;&#21327;&#31243;&#21477;&#26564;&#65292;&#37027;&#20040;&#65288;&#36890;&#36807;&#35843;&#29992; <span class="t-c"><span class="mw-geshi cpp source-cpp">handle.<span class="me1">resume</span><span class="br0">(</span><span class="br0">)</span></span></span>&#65289;&#24674;&#22797;&#35813;&#21477;&#26564;&#65288;&#27880;&#24847;&#36825;&#21487;&#20197;&#36830;&#38145;&#36827;&#34892;&#65292;&#24182;&#26368;&#32456;&#23548;&#33268;&#24403;&#21069;&#21327;&#31243;&#24674;&#22797;&#65289;</li>
<li>&#22914;&#26524; <code>await_suspend</code> &#25243;&#20986;&#24322;&#24120;&#65292;&#37027;&#20040;&#25429;&#25417;&#35813;&#24322;&#24120;&#65292;&#24674;&#22797;&#21327;&#31243;&#65292;&#24182;&#31435;&#21363;&#37325;&#25243;&#24322;&#24120;</li>
</ul>
</dd>
<dd>&#26368;&#21518;&#65292;&#35843;&#29992; <span class="t-c"><span class="mw-geshi cpp source-cpp">awaiter.<span class="me1">await_resume</span><span class="br0">(</span><span class="br0">)</span></span></span>&#65292;&#23427;&#30340;&#32467;&#26524;&#23601;&#26159;&#25972;&#20010; <span class="t-c"><span class="mw-geshi cpp source-cpp">co_await expr</span></span> &#34920;&#36798;&#24335;&#30340;&#32467;&#26524;&#12290;</dd>
</dl>
<p>&#22914;&#26524;&#21327;&#31243;&#22312; co_await &#34920;&#36798;&#24335;&#20013;&#26242;&#20572;&#32780;&#22312;&#21518;&#26469;&#24674;&#22797;&#65292;&#37027;&#20040;&#24674;&#22797;&#28857;&#22788;&#20110;&#32039;&#25509;&#23545; <span class="t-c"><span class="mw-geshi cpp source-cpp">awaiter.<span class="me1">await_resume</span><span class="br0">(</span><span class="br0">)</span></span></span> &#30340;&#35843;&#29992;&#20043;&#21069;&#12290;</p>
<p>&#27880;&#24847;&#65292;&#22240;&#20026;&#21327;&#31243;&#22312;&#36827;&#20837; <span class="t-c"><span class="mw-geshi cpp source-cpp">awaiter.<span class="me1">await_suspend</span><span class="br0">(</span><span class="br0">)</span></span></span> &#21069;&#24050;&#32463;&#23436;&#20840;&#26242;&#20572;&#65292;&#25152;&#20197;&#35813;&#20989;&#25968;&#21487;&#20197;&#33258;&#30001;&#22320;&#22312;&#32447;&#31243;&#38388;&#36716;&#31227;&#21327;&#31243;&#26564;&#32780;&#26080;&#38656;&#39069;&#22806;&#21516;&#27493;&#12290;&#20363;&#22914;&#65292;&#21487;&#20197;&#23558;&#23427;&#25918;&#20837;&#22238;&#35843;&#65292;&#23558;&#23427;&#35843;&#24230;&#25104;&#22312;&#24322;&#27493; I/O &#25805;&#20316;&#23436;&#25104;&#26102;&#22312;&#32447;&#31243;&#27744;&#19978;&#36816;&#34892;&#31561;&#12290;&#27492;&#26102;&#22240;&#20026;&#24403;&#21069;&#21327;&#31243;&#21487;&#33021;&#24050;&#34987;&#24674;&#22797;&#65292;&#20174;&#32780;&#25191;&#34892;&#20102;&#31561;&#24453;&#22120;&#30340;&#26512;&#26500;&#20989;&#25968;&#65292;&#21516;&#26102;&#30001;&#20110; <code>await_suspend()</code> &#22312;&#24403;&#21069;&#32447;&#31243;&#19978;&#25345;&#32493;&#25191;&#34892;&#65292; <code>await_suspend()</code> &#24212;&#35813;&#25226; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>this</span></span> &#24403;&#20316;&#24050;&#34987;&#38144;&#27585;&#24182;&#19988;&#22312;&#26564;&#34987;&#21457;&#24067;&#21040;&#20854;&#20182;&#32447;&#31243;&#21518;&#19981;&#20877;&#35775;&#38382;&#23427;&#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;stdexcept&gt;</span>
<span class="co2">#include &lt;thread&gt;</span>
<span class="kw4">auto</span> switch_to_new_thread<span class="br0">(</span>std<span class="sy4">::</span><span class="me2">jthread</span><span class="sy3">&amp;</span> out<span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">struct</span> awaitable <span class="br0">{</span>
std<span class="sy4">::</span><span class="me2">jthread</span><span class="sy2">*</span> p_out<span class="sy4">;</span>
<span class="kw4">bool</span> await_ready<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="kw2">false</span><span class="sy4">;</span> <span class="br0">}</span>
<span class="kw4">void</span> await_suspend<span class="br0">(</span>std<span class="sy4">::</span><span class="me2">coroutine_handle</span><span class="sy1">&lt;&gt;</span> h<span class="br0">)</span> <span class="br0">{</span>
std<span class="sy4">::</span><span class="me2">jthread</span><span class="sy3">&amp;</span> out <span class="sy1">=</span> <span class="sy2">*</span>p_out<span class="sy4">;</span>
<span class="kw1">if</span> <span class="br0">(</span>out.<span class="me1">joinable</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>
<span class="kw1">throw</span> <a href="cpp-error-runtime_error.html"><span class="kw770">std::<span class="me2">runtime_error</span></span></a><span class="br0">(</span><span class="st0">&quot;jthread &#36755;&#20986;&#21442;&#25968;&#38750;&#31354;&quot;</span><span class="br0">)</span><span class="sy4">;</span>
out <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">jthread</span><span class="br0">(</span><span class="br0">[</span>h<span class="br0">]</span> <span class="br0">{</span> h.<span class="me1">resume</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span>
<span class="co1">// &#28508;&#22312;&#30340;&#26410;&#23450;&#20041;&#34892;&#20026;&#65306;&#35775;&#38382;&#28508;&#22312;&#34987;&#38144;&#27585;&#30340; *this</span>
<span class="co1">// std::cout &lt;&lt; &quot;&#26032;&#32447;&#31243; ID&#65306;&quot; &lt;&lt; p_out-&gt;get_id() &lt;&lt; &quot;\n&quot;;</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">&quot;&#26032;&#32447;&#31243; ID&#65306;&quot;</span> <span class="sy1">&lt;&lt;</span> out.<span class="me1">get_id</span><span class="br0">(</span><span class="br0">)</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy4">;</span> <span class="co1">// &#36825;&#26679;&#21487;&#20197;</span>
<span class="br0">}</span>
<span class="kw4">void</span> await_resume<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">return</span> awaitable<span class="br0">{</span><span class="sy3">&amp;</span>out<span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw1">struct</span> task <span class="br0">{</span>
<span class="kw1">struct</span> promise_type <span class="br0">{</span>
task get_return_object<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>
std<span class="sy4">::</span><span class="me2">suspend_never</span> initial_suspend<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>
std<span class="sy4">::</span><span class="me2">suspend_never</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>
<span class="kw4">void</span> return_void<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span>
<span class="kw4">void</span> unhandled_exception<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
task resuming_on_new_thread<span class="br0">(</span>std<span class="sy4">::</span><span class="me2">jthread</span><span class="sy3">&amp;</span> out<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> <span class="st0">&quot;&#21327;&#31243;&#24320;&#22987;&#65292;&#32447;&#31243; ID&#65306;&quot;</span> <span class="sy1">&lt;&lt;</span> <a href="cpp-thread-get_id.html"><span class="kw2148">std::<span class="me2">this_thread</span><span class="sy4">::</span><span class="me2">get_id</span></span></a><span class="br0">(</span><span class="br0">)</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
co_await switch_to_new_thread<span class="br0">(</span>out<span class="br0">)</span><span class="sy4">;</span>
<span class="co1">// &#31561;&#24453;&#22120;&#22312;&#27492;&#38144;&#27585;</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">&quot;&#21327;&#31243;&#24674;&#22797;&#65292;&#32447;&#31243; ID&#65306;&quot;</span> <span class="sy1">&lt;&lt;</span> <a href="cpp-thread-get_id.html"><span class="kw2148">std::<span class="me2">this_thread</span><span class="sy4">::</span><span class="me2">get_id</span></span></a><span class="br0">(</span><span class="br0">)</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
std<span class="sy4">::</span><span class="me2">jthread</span> out<span class="sy4">;</span>
resuming_on_new_thread<span class="br0">(</span>out<span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#21487;&#33021;&#30340;&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">&#21327;&#31243;&#24320;&#22987;&#65292;&#32447;&#31243; ID&#65306;139972277602112
&#26032;&#32447;&#31243; ID&#65306;139972267284224
&#21327;&#31243;&#24674;&#22797;&#65292;&#32447;&#31243; ID&#65306;139972267284224</pre></div>
</div>
</div>
<p>&#27880;&#24847;&#65306;&#31561;&#24453;&#22120;&#23545;&#35937;&#26159;&#21327;&#31243;&#29366;&#24577;&#30340;&#19968;&#37096;&#20998;&#65288;&#20316;&#20026;&#29983;&#23384;&#26399;&#36328;&#36807;&#26242;&#20572;&#28857;&#30340;&#20020;&#26102;&#37327;&#65289;&#65292;&#24182;&#19988;&#22312; co_await &#34920;&#36798;&#24335;&#32467;&#26463;&#21069;&#38144;&#27585;&#12290;&#21487;&#20197;&#29992;&#23427;&#32500;&#25252;&#26576;&#20123;&#24322;&#27493; I/O API &#25152;&#35201;&#27714;&#30340;&#27599;&#25805;&#20316;&#20869;&#29366;&#24577;&#65292;&#32780;&#26080;&#38656;&#29992;&#21040;&#39069;&#22806;&#30340;&#22534;&#20998;&#37197;&#12290;</p>
<p>&#26631;&#20934;&#24211;&#23450;&#20041;&#20102;&#20004;&#20010;&#24179;&#20961;&#30340;&#21487;&#31561;&#24453;&#20307;&#65306;<span class="t-lc">std::suspend_always</span> &#21450; <span class="t-lc">std::suspend_never</span>&#12290;</p>
<table class="metadata plainlinks ambox mbox-small-left ambox-notice" style="">
<tr>
<td class="mbox-empty-cell"></td>
<td class="mbox-text" style="">&#26412;&#33410;&#26410;&#23436;&#25104;<br />
&#21407;&#22240;&#65306;&#31034;&#20363;</td>
</tr>
</table>
<h3><span class="mw-headline" id="co_yield">co_yield</span></h3>
<p>yield &#34920;&#36798;&#24335;&#21521;&#35843;&#29992;&#26041;&#36820;&#22238;&#19968;&#20010;&#20540;&#24182;&#26242;&#20572;&#24403;&#21069;&#21327;&#31243;&#65306;&#23427;&#26159;&#21487;&#24674;&#22797;&#29983;&#25104;&#22120;&#20989;&#25968;&#30340;&#24120;&#29992;&#26500;&#24314;&#22359;</p>
<table class="t-sdsc-begin">
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td class="t-sdsc-nopad"><code><b>co_yield</b></code> <span class="t-spar">&#34920;&#36798;&#24335;</span></td>
<td class="t-sdsc-nopad"></td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td class="t-sdsc-nopad"><code><b>co_yield</b></code> <span class="t-spar">&#33457;&#25324;&#21495;&#21021;&#22987;&#21270;&#22120;&#21015;&#34920;</span></td>
<td class="t-sdsc-nopad"></td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
</table>
<p>&#23427;&#31561;&#20215;&#20110;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1">co_await promise.<span class="me1">yield_value</span><span class="br0">(</span>&#34920;&#36798;&#24335;<span class="br0">)</span></pre></div>
</div>
<p>&#20856;&#22411;&#30340;&#29983;&#25104;&#22120;&#30340; <code>yield_value</code> &#20250;&#23558;&#20854;&#23454;&#21442;&#23384;&#20648;&#65288;&#22797;&#21046;/&#31227;&#21160;&#25110;&#20165;&#23384;&#20648;&#20854;&#22320;&#22336;&#65292;&#22240;&#20026;&#23454;&#21442;&#30340;&#29983;&#23384;&#26399;&#36328;&#36807; co_await &#20869;&#30340;&#26242;&#20572;&#28857;&#65289;&#21040;&#29983;&#25104;&#22120;&#23545;&#35937;&#20013;&#24182;&#36820;&#22238; <span class="t-lc">std::suspend_always</span>&#65292;&#23558;&#25511;&#21046;&#36716;&#31227;&#32473;&#35843;&#29992;&#26041;/&#24674;&#22797;&#26041;&#12290;</p>
<table class="metadata plainlinks ambox mbox-small-left ambox-notice" style="">
<tr>
<td class="mbox-empty-cell"></td>
<td class="mbox-text" style="">&#26412;&#33410;&#26410;&#23436;&#25104;<br />
&#21407;&#22240;&#65306;&#31034;&#20363;</td>
</tr>
</table>
<h3><span class="mw-headline" id=".E5.BA.93.E6.94.AF.E6.8C.81">&#24211;&#25903;&#25345;</span></h3>
<p><a href="cpp-coroutine.html">&#21327;&#31243;&#25903;&#25345;&#24211;</a>&#23450;&#20041;&#25968;&#20010;&#31867;&#22411;&#65292;&#25552;&#20379;&#21327;&#31243;&#30340;&#32534;&#35793;&#19982;&#36816;&#34892;&#26102;&#25903;&#25345;&#12290;</p>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>