<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>C++20 - 标签 - 豆浆小屋</title><link>https://soybeanmilk.netlify.app/tags/c++20/</link><description>C++20 - 标签 - 豆浆小屋</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><copyright>This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.</copyright><lastBuildDate>Fri, 17 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://soybeanmilk.netlify.app/tags/c++20/" rel="self" type="application/rss+xml"/><item><title>C++20 新特性</title><link>https://soybeanmilk.netlify.app/cpp20%E6%96%B0%E7%89%B9%E6%80%A7/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate><author><name>作者</name></author><guid>https://soybeanmilk.netlify.app/cpp20%E6%96%B0%E7%89%B9%E6%80%A7/</guid><description><![CDATA[<blockquote>
<p>C++20 是继 C++11 以来最大的版本更新，四大天王：Concepts、Ranges、Coroutines、Modules。</p></blockquote>
<hr>
<h2 id="一概念concepts" class="headerLink">
    <a href="#%e4%b8%80%e6%a6%82%e5%bf%b5concepts" class="header-mark"></a>1 一、概念（Concepts）⭐</h2><p>给模板参数加约束，让模板报错不再是天书：</p>
<h3 id="11-基础用法" class="headerLink">
    <a href="#11-%e5%9f%ba%e7%a1%80%e7%94%a8%e6%b3%95" class="header-mark"></a>1.1 1.1 基础用法</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="c1">// 定义一个概念：T 必须是可加的
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="k">concept</span> <span class="n">Addable</span> <span class="o">=</span> <span class="k">requires</span><span class="p">(</span><span class="n">T</span> <span class="n">a</span><span class="p">,</span> <span class="n">T</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="p">}</span> <span class="o">-&gt;</span> <span class="n">std</span><span class="o">::</span><span class="n">same_as</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 使用概念约束模板参数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">template</span><span class="o">&lt;</span><span class="n">Addable</span> <span class="n">T</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="n">T</span> <span class="n">add</span><span class="p">(</span><span class="n">T</span> <span class="n">a</span><span class="p">,</span> <span class="n">T</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="12-requires-表达式" class="headerLink">
    <a href="#12-requires-%e8%a1%a8%e8%be%be%e5%bc%8f" class="header-mark"></a>1.2 1.2 requires 表达式</h3><p>四种约束形式：</p>
<ul>
<li><strong>简单约束</strong>：<code>sizeof(T) == 4</code></li>
<li><strong>类型约束</strong>：<code>std::integral&lt;T&gt;</code></li>
<li><strong>复合约束</strong>：<code>{ expr } -&gt; 类型概念</code></li>
<li><strong>嵌套约束</strong>：<code>requires { ... }</code></li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="k">concept</span> <span class="n">Container</span> <span class="o">=</span> <span class="k">requires</span><span class="p">(</span><span class="n">T</span> <span class="n">c</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">c</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span>       <span class="c1">// 必须有 begin()
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">c</span><span class="p">.</span><span class="n">end</span><span class="p">();</span>         <span class="c1">// 必须有 end()
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">typename</span> <span class="n">T</span><span class="o">::</span><span class="n">value_type</span><span class="p">;</span>  <span class="c1">// 必须有 value_type 类型
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="p">{</span> <span class="n">c</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="p">}</span> <span class="o">-&gt;</span> <span class="n">std</span><span class="o">::</span><span class="n">convertible_to</span><span class="o">&lt;</span><span class="n">size_t</span><span class="o">&gt;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="13-标准库内置概念" class="headerLink">
    <a href="#13-%e6%a0%87%e5%87%86%e5%ba%93%e5%86%85%e7%bd%ae%e6%a6%82%e5%bf%b5" class="header-mark"></a>1.3 1.3 标准库内置概念</h3><p><code>&lt;concepts&gt;</code> 头文件里提供了一堆：</p>
<ul>
<li><code>std::same_as&lt;T, U&gt;</code> — 类型相同</li>
<li><code>std::derived_from&lt;Derived, Base&gt;</code> — 派生关系</li>
<li><code>std::convertible_to&lt;From, To&gt;</code> — 可转换</li>
<li><code>std::integral&lt;T&gt;</code> — 整型</li>
<li><code>std::floating_point&lt;T&gt;</code> — 浮点型</li>
<li><code>std::ranges::range&lt;T&gt;</code> — 范围</li>
</ul>
<hr>
<h2 id="二范围库ranges" class="headerLink">
    <a href="#%e4%ba%8c%e8%8c%83%e5%9b%b4%e5%ba%93ranges" class="header-mark"></a>2 二、范围库（Ranges）⭐</h2><p>彻底改变 STL 算法的写法，支持链式调用：</p>
<h3 id="21-管道式写法" class="headerLink">
    <a href="#21-%e7%ae%a1%e9%81%93%e5%bc%8f%e5%86%99%e6%b3%95" class="header-mark"></a>2.1 2.1 管道式写法</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;ranges&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">nums</span> <span class="o">=</span> <span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// C++17：嵌套调用，可读性差
</span></span></span><span class="line"><span class="cl"><span class="c1">// C++20：管道式，从左到右读
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">auto</span> <span class="n">result</span> <span class="o">=</span> <span class="n">nums</span>
</span></span><span class="line"><span class="cl">    <span class="o">|</span> <span class="n">std</span><span class="o">::</span><span class="n">views</span><span class="o">::</span><span class="n">filter</span><span class="p">([](</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">n</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">;</span> <span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="o">|</span> <span class="n">std</span><span class="o">::</span><span class="n">views</span><span class="o">::</span><span class="n">transform</span><span class="p">([](</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">n</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span> <span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="o">|</span> <span class="n">std</span><span class="o">::</span><span class="n">views</span><span class="o">::</span><span class="n">take</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="nl">x</span> <span class="p">:</span> <span class="n">result</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="s">&#34; &#34;</span><span class="p">;</span>  <span class="c1">// 4 8 12
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="22-常用视图适配器" class="headerLink">
    <a href="#22-%e5%b8%b8%e7%94%a8%e8%a7%86%e5%9b%be%e9%80%82%e9%85%8d%e5%99%a8" class="header-mark"></a>2.2 2.2 常用视图适配器</h3><table>
  <thead>
      <tr>
          <th>适配器</th>
          <th>作用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>views::filter</code></td>
          <td>过滤</td>
      </tr>
      <tr>
          <td><code>views::transform</code></td>
          <td>转换映射</td>
      </tr>
      <tr>
          <td><code>views::take(n)</code></td>
          <td>取前 n 个</td>
      </tr>
      <tr>
          <td><code>views::drop(n)</code></td>
          <td>跳过前 n 个</td>
      </tr>
      <tr>
          <td><code>views::reverse</code></td>
          <td>反转</td>
      </tr>
      <tr>
          <td><code>views::keys</code> / <code>values</code></td>
          <td>取 pair 的 key/value</td>
      </tr>
      <tr>
          <td><code>views::join</code></td>
          <td>扁平化</td>
      </tr>
      <tr>
          <td><code>views::split</code></td>
          <td>分割</td>
      </tr>
  </tbody>
</table>
<h3 id="23-惰性求值" class="headerLink">
    <a href="#23-%e6%83%b0%e6%80%a7%e6%b1%82%e5%80%bc" class="header-mark"></a>2.3 2.3 惰性求值</h3><p>views 不会立即计算，只有在迭代时才生成元素，性能更好。</p>
<hr>
<h2 id="三协程coroutines" class="headerLink">
    <a href="#%e4%b8%89%e5%8d%8f%e7%a8%8bcoroutines" class="header-mark"></a>3 三、协程（Coroutines）</h2><p>函数可以暂停和恢复，异步编程神器：</p>
<h3 id="31-三个新关键字" class="headerLink">
    <a href="#31-%e4%b8%89%e4%b8%aa%e6%96%b0%e5%85%b3%e9%94%ae%e5%ad%97" class="header-mark"></a>3.1 3.1 三个新关键字</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">co_await</span>   <span class="c1">// 暂停，等待异步操作
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">co_return</span>  <span class="c1">// 返回值并结束
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">co_yield</span>   <span class="c1">// 返回一个值并暂停，下次从这里继续
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="32-生成器示例" class="headerLink">
    <a href="#32-%e7%94%9f%e6%88%90%e5%99%a8%e7%a4%ba%e4%be%8b" class="header-mark"></a>3.2 3.2 生成器示例</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">generator</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">fibonacci</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">co_yield</span> <span class="n">b</span><span class="p">;</span>   <span class="c1">// 返回 b，暂停在这里
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kt">int</span> <span class="n">next</span> <span class="o">=</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">a</span> <span class="o">=</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">b</span> <span class="o">=</span> <span class="n">next</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 使用
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="nl">x</span> <span class="p">:</span> <span class="n">fibonacci</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="s">&#34; &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="33-异步任务" class="headerLink">
    <a href="#33-%e5%bc%82%e6%ad%a5%e4%bb%bb%e5%8a%a1" class="header-mark"></a>3.3 3.3 异步任务</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">task</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">fetchData</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">auto</span> <span class="n">data</span> <span class="o">=</span> <span class="k">co_await</span> <span class="n">asyncLoad</span><span class="p">();</span>  <span class="c1">// 暂停，不阻塞线程
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">co_return</span> <span class="n">data</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>注意：标准库只提供了协程机制，没有提供具体的协程类型（task/generator），需要自己实现或用第三方库（如 cppcoro）。C++23 才补了 <code>std::generator</code>。</p></blockquote>
<hr>
<h2 id="四模块modules" class="headerLink">
    <a href="#%e5%9b%9b%e6%a8%a1%e5%9d%97modules" class="header-mark"></a>4 四、模块（Modules）</h2><p>告别 <code>#include</code>，解决头文件地狱：</p>
<h3 id="41-定义模块" class="headerLink">
    <a href="#41-%e5%ae%9a%e4%b9%89%e6%a8%a1%e5%9d%97" class="header-mark"></a>4.1 4.1 定义模块</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="c1">// math.ixx （模块接口文件）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">export</span> <span class="n">module</span> <span class="n">math</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">export</span> <span class="kt">int</span> <span class="nf">add</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">export</span> <span class="k">namespace</span> <span class="n">math_utils</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="nf">mul</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="42-导入模块" class="headerLink">
    <a href="#42-%e5%af%bc%e5%85%a5%e6%a8%a1%e5%9d%97" class="header-mark"></a>4.2 4.2 导入模块</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">import</span> <span class="n">math</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">math_utils</span><span class="o">::</span><span class="n">mul</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>优点：</strong></p>
<ul>
<li>编译速度大幅提升（只编译一次）</li>
<li>没有宏污染</li>
<li>模块内部的东西默认不导出，封装更好</li>
</ul>
<hr>
<h2 id="五三路比较运算符-" class="headerLink">
    <a href="#%e4%ba%94%e4%b8%89%e8%b7%af%e6%af%94%e8%be%83%e8%bf%90%e7%ae%97%e7%ac%a6-" class="header-mark"></a>5 五、三路比较运算符 <code>&lt;=&gt;</code></h2><p>俗称「飞船运算符」，一次比较得出大小关系：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">Point</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">auto</span> <span class="k">operator</span><span class="o">&lt;=&gt;</span><span class="p">(</span><span class="k">const</span> <span class="n">Point</span><span class="o">&amp;</span><span class="p">)</span> <span class="k">const</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>  <span class="c1">// 自动生成所有比较运算符
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Point</span> <span class="n">a</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">},</span> <span class="n">b</span><span class="p">{</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="n">a</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">;</span>   <span class="c1">// OK，自动生成
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">a</span> <span class="o">&gt;=</span> <span class="n">b</span><span class="p">;</span>  <span class="c1">// OK
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">a</span> <span class="o">==</span> <span class="n">b</span><span class="p">;</span>  <span class="c1">// OK
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>返回类型有三种：</p>
<ul>
<li><code>std::strong_ordering</code> — 强序（完全可比）</li>
<li><code>std::weak_ordering</code> — 弱序</li>
<li><code>std::partial_ordering</code> — 偏序（可能不可比，比如 NaN）</li>
</ul>
<hr>
<h2 id="六指定初始化designated-initializers" class="headerLink">
    <a href="#%e5%85%ad%e6%8c%87%e5%ae%9a%e5%88%9d%e5%a7%8b%e5%8c%96designated-initializers" class="header-mark"></a>6 六、指定初始化（Designated Initializers）</h2><p>像 C 语言那样按名字初始化结构体成员：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">Point</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">z</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Point</span> <span class="n">p</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">z</span> <span class="o">=</span> <span class="mi">30</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// y 用默认值 0
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">};</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>注意：顺序必须和声明顺序一致，不能跳着来。</p>
<hr>
<h2 id="七consteval-与-constinit" class="headerLink">
    <a href="#%e4%b8%83consteval-%e4%b8%8e-constinit" class="header-mark"></a>7 七、<code>consteval</code> 与 <code>constinit</code></h2><h3 id="71-consteval--立即函数" class="headerLink">
    <a href="#71-consteval--%e7%ab%8b%e5%8d%b3%e5%87%bd%e6%95%b0" class="header-mark"></a>7.1 7.1 consteval — 立即函数</h3><p>必须在编译期执行，否则报错：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">consteval</span> <span class="kt">int</span> <span class="nf">sqr</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">n</span> <span class="o">*</span> <span class="n">n</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">constexpr</span> <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="n">sqr</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>  <span class="c1">// OK，编译期
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">b</span> <span class="o">=</span> <span class="n">sqr</span><span class="p">(</span><span class="mi">20</span><span class="p">);</span>            <span class="c1">// OK，编译期常量
</span></span></span><span class="line"><span class="cl"><span class="c1">// int x = 5; sqr(x);       // ERROR，x 不是编译期常量
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="72-constinit--常量初始化" class="headerLink">
    <a href="#72-constinit--%e5%b8%b8%e9%87%8f%e5%88%9d%e5%a7%8b%e5%8c%96" class="header-mark"></a>7.2 7.2 constinit — 常量初始化</h3><p>保证变量在编译期初始化，避免静态初始化顺序问题：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">constinit</span> <span class="kt">int</span> <span class="n">global</span> <span class="o">=</span> <span class="n">compute_at_compile_time</span><span class="p">();</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="八stdformat" class="headerLink">
    <a href="#%e5%85%abstdformat" class="header-mark"></a>8 八、<code>std::format</code></h2><p>Python 风格的格式化字符串，终于不用 <code>printf</code> 或 <code>stringstream</code> 了：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;format&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">s</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">&#34;Hello, {}! You are {} years old.&#34;</span><span class="p">,</span> <span class="s">&#34;Tom&#34;</span><span class="p">,</span> <span class="mi">25</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// &#34;Hello, Tom! You are 25 years old.&#34;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">// 按位置
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">&#34;{1} {0}&#34;</span><span class="p">,</span> <span class="s">&#34;world&#34;</span><span class="p">,</span> <span class="s">&#34;Hello&#34;</span><span class="p">);</span>  <span class="c1">// &#34;Hello world&#34;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">// 格式说明
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">&#34;{:&gt;10}&#34;</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>    <span class="c1">// 右对齐，占10位
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">&#34;{:08b}&#34;</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>    <span class="c1">// 8位二进制，前导零
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">&#34;{:.2f}&#34;</span><span class="p">,</span> <span class="mf">3.14159</span><span class="p">);</span>  <span class="c1">// 保留2位小数
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="九stdspan" class="headerLink">
    <a href="#%e4%b9%9dstdspan" class="header-mark"></a>9 九、<code>std::span</code></h2><p>连续内存的视图，类似 <code>string_view</code> 但是通用的：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">printArray</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">span</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">arr</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="nl">x</span> <span class="p">:</span> <span class="n">arr</span><span class="p">)</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="s">&#34; &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">a</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="n">printArray</span><span class="p">(</span><span class="n">a</span><span class="p">);</span>              <span class="c1">// 原生数组
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">vector</span> <span class="n">v</span> <span class="o">=</span> <span class="p">{</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="n">printArray</span><span class="p">(</span><span class="n">v</span><span class="p">);</span>              <span class="c1">// vector
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="十其他特性速览" class="headerLink">
    <a href="#%e5%8d%81%e5%85%b6%e4%bb%96%e7%89%b9%e6%80%a7%e9%80%9f%e8%a7%88" class="header-mark"></a>10 十、其他特性速览</h2><table>
  <thead>
      <tr>
          <th>特性</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>std::jthread</code></td>
          <td>自动 join 的线程，支持停止令牌</td>
      </tr>
      <tr>
          <td><code>std::stop_token</code></td>
          <td>协作式线程中断</td>
      </tr>
      <tr>
          <td><code>std::source_location</code></td>
          <td>获取当前代码位置（文件名、行号）</td>
      </tr>
      <tr>
          <td><code>std::bit_cast</code></td>
          <td>安全的类型双关，替代 memcpy</td>
      </tr>
      <tr>
          <td><code>std::midpoint</code> / <code>std::lerp</code></td>
          <td>中点和线性插值</td>
      </tr>
      <tr>
          <td><code>[[likely]]</code> / <code>[[unlikely]]</code></td>
          <td>给编译器分支预测提示</td>
      </tr>
      <tr>
          <td>范围 for 初始化语句</td>
          <td><code>for (auto it = v.begin(); auto x : v)</code></td>
      </tr>
  </tbody>
</table>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="c1">// likely/unlikely 示例
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">if</span> <span class="p">(</span><span class="n">likely</span><span class="p">(</span><span class="n">n</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// 大概率走这里，编译器优化
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// 小概率
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="总结" class="headerLink">
    <a href="#%e6%80%bb%e7%bb%93" class="header-mark"></a>11 总结</h2><p>C++20 是<strong>改变编程范式的大版本</strong>：</p>
<ul>
<li><strong>Concepts</strong>：模板终于好用了，报错终于能看懂了</li>
<li><strong>Ranges</strong>：STL 算法的现代写法，链式调用爽</li>
<li><strong>Coroutines</strong>：异步编程基础设施</li>
<li><strong>Modules</strong>：告别头文件，编译起飞</li>
<li><strong>format / span / jthread</strong>：各种小确幸</li>
</ul>
]]></description></item></channel></rss>