377 lines
25 KiB
HTML
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">< <a href="cpp.html">cpp</a>‎ | <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>定义于头文件 <code><a href="cpp-header-coroutine.html"><coroutine></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"><</span> <span class="kw1">class</span> Promise <span class="sy1">=</span> <span class="kw4">void</span> <span class="sy1">></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 起)</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"><></span> <span class="kw1">struct</span> coroutine_handle<span class="sy1"><</span><span class="kw4">void</span><span class="sy1">></span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</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"><></span> <span class="kw1">struct</span> coroutine_handle<span class="sy1"><</span>std<span class="sy4">::</span><span class="me2">noop_coroutine_promise</span><span class="sy1">></span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(3)</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</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 />
|
|
std<span class="sy4">::</span><span class="me2">coroutine_handle</span><span class="sy1"><</span>std<span class="sy4">::</span><span class="me2">noop_coroutine_promise</span><span class="sy1">></span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(4)</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>类模板 <code>coroutine_handle</code> 能用于指代暂停或执行的协程。 <code>coroutine_handle</code> 的每个特化均为<a href="cpp-named_req-LiteralType.html"><span style="font-style:italic">字面类型</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(LiteralType)</span></a> 。</p>
|
|
<div class="t-li1"><span class="t-li">1)</span> 主模板,可从 <code>Promise</code> 类型的承诺对象创建。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 特化 <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"><</span><span class="kw4">void</span><span class="sy1">></span></span></span> 擦除承诺类型。它可从其他特化转换。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 特化 <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"><</span>std<span class="sy4">::</span><span class="me2">noop_coroutine_promise</span><span class="sy1">></span></span></span> 指代无操作协程。不能从承诺对象创建它。</div>
|
|
<p>典型实现上, <span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">coroutine_handle</span></span></span> 的每个特化均为<a href="cpp-named_req-TriviallyCopyable.html"><span style="font-style:italic">可平凡复制</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(TriviallyCopyable)</span></a> ,并保有一个指向协程状态的指针作为其仅有的非静态成员。</p>
|
|
<p>添加 <code>coroutine_handle</code> 的特化的程序行为未定义。</p>
|
|
<h3><span class="mw-headline" id=".E6.88.90.E5.91.98.E5.87.BD.E6.95.B0">成员函数</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>(构造函数)</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>构造 <code>coroutine_handle</code> 对象<br />
|
|
<span class="t-mark">(公开成员函数)</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>赋值 <code>coroutine_handle</code> 对象<br />
|
|
<span class="t-mark">(公开成员函数)</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">[静态]</span> <span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>从协程的承诺对象创建 <code>coroutine_handle</code><br />
|
|
<span class="t-mark">(公开静态成员函数)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">
|
|
<h5><span class="mw-headline" id=".E8.BD.AC.E6.8D.A2">转换</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<></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>获得擦除类型的 <code>coroutine_handle</code><br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">
|
|
<h5><span class="mw-headline" id=".E8.A7.82.E5.AF.9F.E5.99.A8">观察器</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>检查协程是否已完成<br />
|
|
<span class="t-mark">(公开成员函数)</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>检查柄是否表示协程<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">
|
|
<h5><span class="mw-headline" id=".E6.8E.A7.E5.88.B6">控制</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>恢复协程执行<br />
|
|
<span class="t-mark">(公开成员函数)</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>销毁协程<br />
|
|
<span class="t-mark">(公开成员函数)</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">承诺访问</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>访问协程的承诺对象<br />
|
|
<span class="t-mark">(公开成员函数)</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">导出/导入</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>导出底层地址,即支撑协程的指针<br />
|
|
<span class="t-mark">(公开成员函数)</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">[静态]</span> <span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>从指针导入协程<br />
|
|
<span class="t-mark">(公开静态成员函数)</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">非成员函数</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<=></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>比较二个 <code>coroutine_handle</code> 对象<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.BE.85.E5.8A.A9.E7.B1.BB">辅助类</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"><std::coroutine_handle></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> 的散列支持<br />
|
|
<span class="t-mark">(类模板特化)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p><code>coroutine_handle</code> 可能悬垂,该情况下必须谨慎使用该 <code>coroutine_handle</code> 以避免未定义行为。</p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</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 <coroutine></span>
|
|
<span class="co2">#include <iostream></span>
|
|
<span class="co2">#include <optional></span>
|
|
<span class="co2">#include <ranges></span>
|
|
|
|
<span class="kw1">template</span><span class="sy1"><</span><span class="kw1">typename</span> T<span class="sy1">></span> requires std<span class="sy4">::</span><span class="me2">movable</span><span class="sy1"><</span>T<span class="sy1">></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"><</span>T<span class="sy1">></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">// 生成器协程中不允许 co_await 。</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"><</span>T<span class="sy1">></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"><</span>promise_type<span class="sy1">></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">&</span><span class="br0">)</span> <span class="sy1">=</span> delete<span class="sy4">;</span>
|
|
Generator<span class="sy3">&</span> operator<span class="sy1">=</span><span class="br0">(</span><span class="kw4">const</span> Generator<span class="sy3">&</span><span class="br0">)</span> <span class="sy1">=</span> delete<span class="sy4">;</span>
|
|
|
|
Generator<span class="br0">(</span>Generator<span class="sy3">&&</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">&</span> operator<span class="sy1">=</span><span class="br0">(</span>Generator<span class="sy3">&&</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">&</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">// 基于范围的 for 循环支持。</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">&</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"><</span>std<span class="sy4">::</span><span class="me2">integral</span> T<span class="sy1">></span>
|
|
Generator<span class="sy1"><</span>T<span class="sy1">></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"><</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"><<</span> i <span class="sy1"><<</span> <span class="st0">' '</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"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</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">缺陷报告</span></h3>
|
|
<p>下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。</p>
|
|
<table class="dsctable" style="font-size:0.8em">
|
|
<tr>
|
|
<th>DR</th>
|
|
<th>应用于</th>
|
|
<th>出版时的行为</th>
|
|
<th>正确行为</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> 的公开基类能将它置于不想要的状态</td>
|
|
<td>移除继承</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|