<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>现代C++ - 标签 - 豆浆小屋</title><link>https://soybeanmilk.netlify.app/tags/%E7%8E%B0%E4%BB%A3c++/</link><description>现代C++ - 标签 - 豆浆小屋</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/%E7%8E%B0%E4%BB%A3c++/" rel="self" type="application/rss+xml"/><item><title>C++14 新特性</title><link>https://soybeanmilk.netlify.app/cpp14%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/cpp14%E6%96%B0%E7%89%B9%E6%80%A7/</guid><description><![CDATA[<blockquote>
<p>C++14 是 C++11 的小版本更新，主要是完善和补充，核心特性不多但很实用。</p></blockquote>
<hr>
<h2 id="一函数返回值类型推导" class="headerLink">
    <a href="#%e4%b8%80%e5%87%bd%e6%95%b0%e8%bf%94%e5%9b%9e%e5%80%bc%e7%b1%bb%e5%9e%8b%e6%8e%a8%e5%af%bc" class="header-mark"></a>1 一、函数返回值类型推导</h2><p>C++11 只有 lambda 可以用 <code>auto</code> 推导返回值，C++14 扩展到所有函数：</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="c1">// C++14：自动推导返回 int
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">auto</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="c1">// 多个 return 必须类型一致
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">auto</span> <span class="nf">f</span><span class="p">(</span><span class="kt">bool</span> <span class="n">flag</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">)</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>    <span class="c1">// int
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">else</span> <span class="k">return</span> <span class="mi">2</span><span class="p">;</span>         <span class="c1">// OK，都是 int
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="c1">// return 3.14;        // ERROR，类型不一致
</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><strong>注意：</strong></p>
<ul>
<li>递归函数不能用 auto 返回值推导（除非先有前置声明）</li>
<li>有多个 return 语句时，所有 return 的类型必须相同</li>
</ul>
<hr>
<h2 id="二泛型-lambdageneric-lambda" class="headerLink">
    <a href="#%e4%ba%8c%e6%b3%9b%e5%9e%8b-lambdageneric-lambda" class="header-mark"></a>2 二、泛型 lambda（Generic Lambda）</h2><p>C++11 的 lambda 参数必须写具体类型，C++14 可以用 <code>auto</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></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">// C++14：参数用 auto，相当于模板函数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">auto</span> <span class="n">add</span> <span class="o">=</span> <span class="p">[](</span><span class="k">auto</span> <span class="n">a</span><span class="p">,</span> <span class="k">auto</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="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 class="c1">// int
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">add</span><span class="p">(</span><span class="mf">1.5</span><span class="p">,</span> <span class="mf">2.3</span><span class="p">);</span>   <span class="c1">// double
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">add</span><span class="p">(</span><span class="n">string</span><span class="p">(</span><span class="s">&#34;a&#34;</span><span class="p">),</span> <span class="n">string</span><span class="p">(</span><span class="s">&#34;b&#34;</span><span class="p">));</span>  <span class="c1">// string
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>本质：</strong> 编译器自动生成一个模板函数对象。</p>
<hr>
<h2 id="三变量模板variable-templates" class="headerLink">
    <a href="#%e4%b8%89%e5%8f%98%e9%87%8f%e6%a8%a1%e6%9d%bfvariable-templates" class="header-mark"></a>3 三、变量模板（Variable Templates）</h2><p>之前只有类模板、函数模板，C++14 新增变量模板：</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="c1">// 定义一个 pi 变量模板
</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">constexpr</span> <span class="n">T</span> <span class="n">pi</span> <span class="o">=</span> <span class="n">T</span><span class="p">(</span><span class="mf">3.1415926535897932385</span><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="kt">float</span>  <span class="n">r1</span> <span class="o">=</span> <span class="n">pi</span><span class="o">&lt;</span><span class="kt">float</span><span class="o">&gt;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">double</span> <span class="n">r2</span> <span class="o">=</span> <span class="n">pi</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span><span class="p">;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>最经典的应用：<code>std::is_same_v&lt;T, U&gt;</code> 就是 C++17 基于变量模板做的。</p>
<hr>
<h2 id="四聚合初始化增强" class="headerLink">
    <a href="#%e5%9b%9b%e8%81%9a%e5%90%88%e5%88%9d%e5%a7%8b%e5%8c%96%e5%a2%9e%e5%bc%ba" class="header-mark"></a>4 四、聚合初始化增强</h2><p>C++14 允许聚合体中含有默认成员初始化器时，仍然可以用花括号初始化：</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">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="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">p1</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="c1">// C++11 不允许，C++14 可以
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Point</span> <span class="n">p2</span><span class="p">{};</span>      <span class="c1">// x=0, y=0，用默认值
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="五decltypeauto" class="headerLink">
    <a href="#%e4%ba%94decltypeauto" class="header-mark"></a>5 五、<code>decltype(auto)</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></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">// 用 auto 会丢失引用
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">auto</span> <span class="nf">f1</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="k">decltype</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">expr</span><span class="p">;</span> <span class="p">}</span>  <span class="c1">// C++11 写法
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">// C++14 简化写法
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">decltype</span><span class="p">(</span><span class="k">auto</span><span class="p">)</span> <span class="n">f2</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">expr</span><span class="p">;</span> <span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>区别：</strong></p>
<ul>
<li><code>auto</code>：会去掉引用和顶层 const</li>
<li><code>decltype(auto)</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></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">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span><span class="o">&amp;</span> <span class="n">ref</span> <span class="o">=</span> <span class="n">x</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">a</span> <span class="o">=</span> <span class="n">ref</span><span class="p">;</span>            <span class="c1">// int
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">decltype</span><span class="p">(</span><span class="k">auto</span><span class="p">)</span> <span class="n">b</span> <span class="o">=</span> <span class="n">ref</span><span class="p">;</span>  <span class="c1">// int&amp;
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="六标准库新增" class="headerLink">
    <a href="#%e5%85%ad%e6%a0%87%e5%87%86%e5%ba%93%e6%96%b0%e5%a2%9e" class="header-mark"></a>6 六、标准库新增</h2><h3 id="61-stdmake_unique" class="headerLink">
    <a href="#61-stdmake_unique" class="header-mark"></a>6.1 6.1 <code>std::make_unique</code></h3><p>C++11 有 <code>make_shared</code> 但漏掉了 <code>make_unique</code>，C++14 补上：</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="k">auto</span> <span class="n">p</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">make_unique</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span>  <span class="c1">// 推荐，比 new 安全
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="62-stdshared_timed_mutex" class="headerLink">
    <a href="#62-stdshared_timed_mutex" class="header-mark"></a>6.2 6.2 <code>std::shared_timed_mutex</code></h3><p>读写锁的超时版本，C++17 又加了 <code>shared_mutex</code>。</p>
<h3 id="63-整数序列-stdinteger_sequence" class="headerLink">
    <a href="#63-%e6%95%b4%e6%95%b0%e5%ba%8f%e5%88%97-stdinteger_sequence" class="header-mark"></a>6.3 6.3 整数序列 <code>std::integer_sequence</code></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></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="p">,</span> <span class="n">T</span><span class="p">...</span> <span class="n">Is</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">integer_sequence</span> <span class="p">{</span> <span class="p">...</span> <span class="p">};</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>日常开发用得少，库作者用得多。</p>
<h3 id="64-stdexchange" class="headerLink">
    <a href="#64-stdexchange" class="header-mark"></a>6.4 6.4 <code>std::exchange</code></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></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">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">v</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="k">auto</span> <span class="n">old</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">exchange</span><span class="p">(</span><span class="n">v</span><span class="p">,</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="c1">// old = {1,2,3}, v = {4,5,6}
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="七其他小特性" class="headerLink">
    <a href="#%e4%b8%83%e5%85%b6%e4%bb%96%e5%b0%8f%e7%89%b9%e6%80%a7" class="header-mark"></a>7 七、其他小特性</h2><table>
  <thead>
      <tr>
          <th>特性</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>二进制字面量</td>
          <td><code>0b1010</code> 表示十进制 10</td>
      </tr>
      <tr>
          <td>数字分隔符</td>
          <td><code>1'000'000</code> 可读性更好</td>
      </tr>
      <tr>
          <td>lambda 初始化捕获</td>
          <td>C++14 可以在捕获列表里初始化新变量</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></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">// 初始化捕获（init capture）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</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="k">auto</span> <span class="n">f</span> <span class="o">=</span> <span class="p">[</span><span class="n">y</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">y</span><span class="p">;</span> <span class="p">};</span>  <span class="c1">// y = 11
</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>8 总结</h2><p>C++14 是一个<strong>过渡版本</strong>，特性不多但都很实用：</p>
<ul>
<li><strong>函数返回值 auto</strong>：写起来更简洁</li>
<li><strong>泛型 lambda</strong>：配合 auto 参数，写算法更方便</li>
<li><strong>decltype(auto)</strong>：完美转发返回值</li>
<li><strong>make_unique</strong>：终于补上了</li>
<li><strong>变量模板</strong>：为后续标准库简化铺路</li>
</ul>
]]></description></item><item><title>C++17 新特性</title><link>https://soybeanmilk.netlify.app/cpp17%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/cpp17%E6%96%B0%E7%89%B9%E6%80%A7/</guid><description><![CDATA[<blockquote>
<p>C++17 是一个大版本，引入了很多实用特性，被称为「最舒服的 C++ 版本」。</p></blockquote>
<hr>
<h2 id="一结构化绑定structured-bindings" class="headerLink">
    <a href="#%e4%b8%80%e7%bb%93%e6%9e%84%e5%8c%96%e7%bb%91%e5%ae%9astructured-bindings" class="header-mark"></a>1 一、结构化绑定（Structured Bindings）⭐</h2><p>最常用的特性之一，一键解包 tuple/struct/数组：</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><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</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">// 解包 pair
</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">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">getPerson</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="p">{</span><span class="mi">25</span><span class="p">,</span> <span class="s">&#34;Tom&#34;</span><span class="p">};</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="p">[</span><span class="n">age</span><span class="p">,</span> <span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">getPerson</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 解包 tuple
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">auto</span> <span class="p">[</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">]</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">make_tuple</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mf">2.5</span><span class="p">,</span> <span class="s">&#34;hello&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 解包 struct
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">struct</span> <span class="nc">Point</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">x</span><span class="p">;</span> <span class="kt">int</span> <span class="n">y</span><span class="p">;</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="n">Point</span> <span class="n">p</span><span class="p">{</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="n">p</span><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="kt">int</span> <span class="n">arr</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="k">auto</span> <span class="p">[</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>结合 map 遍历超好用：</strong></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></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">std</span><span class="o">::</span><span class="n">map</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">m</span> <span class="o">=</span> <span class="p">{{</span><span class="mi">1</span><span class="p">,</span> <span class="s">&#34;a&#34;</span><span class="p">},</span> <span class="p">{</span><span class="mi">2</span><span class="p">,</span> <span class="s">&#34;b&#34;</span><span class="p">}};</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="k">const</span> <span class="k">auto</span><span class="o">&amp;</span> <span class="p">[</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">]</span> <span class="o">:</span> <span class="n">m</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">key</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;: &#34;</span> <span class="o">&lt;&lt;</span> <span class="n">value</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</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>实战（Q347 前 K 个高频元素）：</strong></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="c1">// 传统写法：p.first / p.second 访问键值对
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">for</span> <span class="p">(</span><span class="k">auto</span><span class="o">&amp;</span> <span class="nl">p</span> <span class="p">:</span> <span class="n">u_map</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">vec</span><span class="p">.</span><span class="n">push_back</span><span class="p">({</span><span class="n">p</span><span class="p">.</span><span class="n">second</span><span class="p">,</span> <span class="n">p</span><span class="p">.</span><span class="n">first</span><span class="p">});</span>   <span class="c1">// p.first 是数字，p.second 是次数
</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="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="k">auto</span><span class="o">&amp;</span> <span class="p">[</span><span class="n">num</span><span class="p">,</span> <span class="n">cnt</span><span class="p">]</span> <span class="o">:</span> <span class="n">u_map</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">vec</span><span class="p">.</span><span class="n">push_back</span><span class="p">({</span><span class="n">cnt</span><span class="p">,</span> <span class="n">num</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>注意：LeetCode 默认 C++17，可以直接用 <code>auto [num, cnt]</code>；本地老编译器（C++14 及以下）不支持。</p>
<hr>
<h2 id="二if--switch-初始化语句" class="headerLink">
    <a href="#%e4%ba%8cif--switch-%e5%88%9d%e5%a7%8b%e5%8c%96%e8%af%ad%e5%8f%a5" class="header-mark"></a>2 二、<code>if</code> / <code>switch</code> 初始化语句</h2><p>在 if 条件里定义变量，缩小作用域：</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="c1">// C++17 写法
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">if</span> <span class="p">(</span><span class="k">auto</span> <span class="n">it</span> <span class="o">=</span> <span class="n">m</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">key</span><span class="p">);</span> <span class="n">it</span> <span class="o">!=</span> <span class="n">m</span><span class="p">.</span><span class="n">end</span><span class="p">())</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// 使用 it
</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 class="c1">// it 在这里已经不可见了
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">// switch 同理
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">switch</span> <span class="p">(</span><span class="kt">int</span> <span class="n">val</span> <span class="o">=</span> <span class="n">getValue</span><span class="p">();</span> <span class="n">val</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">case</span> <span class="mi">1</span><span class="o">:</span> <span class="p">...</span>
</span></span><span class="line"><span class="cl">    <span class="k">case</span> <span class="mi">2</span><span class="o">:</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><hr>
<h2 id="三内联变量inline-variables" class="headerLink">
    <a href="#%e4%b8%89%e5%86%85%e8%81%94%e5%8f%98%e9%87%8finline-variables" class="header-mark"></a>3 三、内联变量（Inline Variables）</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></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">// 头文件中，C++17 之前会报重复定义
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">inline</span> <span class="k">constexpr</span> <span class="kt">int</span> <span class="n">MAX_SIZE</span> <span class="o">=</span> <span class="mi">1024</span><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">class</span> <span class="nc">MyClass</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">inline</span> <span class="k">static</span> <span class="kt">int</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>  <span class="c1">// C++17 不需要在 .cpp 里再定义一次
</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="四折叠表达式fold-expressions" class="headerLink">
    <a href="#%e5%9b%9b%e6%8a%98%e5%8f%a0%e8%a1%a8%e8%be%be%e5%bc%8ffold-expressions" class="header-mark"></a>4 四、折叠表达式（Fold Expressions）</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><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</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">// 对所有参数求和
</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="p">...</span> <span class="n">Args</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">sum</span><span class="p">(</span><span class="n">Args</span><span class="p">...</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">(...</span> <span class="o">+</span> <span class="n">args</span><span class="p">);</span>  <span class="c1">// 一元右折叠：((a1 + a2) + a3) + ...
</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">sum</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="c1">// = 10
</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="k">template</span><span class="o">&lt;</span><span class="k">typename</span><span class="p">...</span> <span class="n">Args</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="n">printAll</span><span class="p">(</span><span class="n">Args</span><span class="p">...</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <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="p">...</span> <span class="o">&lt;&lt;</span> <span class="n">args</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</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>四种折叠形式：</p>
<ul>
<li><code>(... op args)</code> 一元右折叠</li>
<li><code>(args op ...)</code> 一元左折叠</li>
<li><code>(init op ... op args)</code> 二元右折叠</li>
<li><code>(args op ... op init)</code> 二元左折叠</li>
</ul>
<hr>
<h2 id="五constexpr-增强" class="headerLink">
    <a href="#%e4%ba%94constexpr-%e5%a2%9e%e5%bc%ba" class="header-mark"></a>5 五、<code>constexpr</code> 增强</h2><p>C++17 中 constexpr 可以用的地方更多了：</p>
<h3 id="51-constexpr-if" class="headerLink">
    <a href="#51-constexpr-if" class="header-mark"></a>5.1 5.1 constexpr if</h3><p>编译期条件判断，替代部分 SFINAE 写法：</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></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">auto</span> <span class="n">getValue</span><span class="p">(</span><span class="n">T</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nf">constexpr</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">is_integral_v</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</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">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">x</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></code></pre></td></tr></table>
</div>
</div><h3 id="52-constexpr-lambda" class="headerLink">
    <a href="#52-constexpr-lambda" class="header-mark"></a>5.2 5.2 constexpr lambda</h3><p>lambda 可以在编译期执行：</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></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">constexpr</span> <span class="k">auto</span> <span class="n">square</span> <span class="o">=</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="n">n</span><span class="p">;</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="k">static_assert</span><span class="p">(</span><span class="n">square</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">==</span> <span class="mi">25</span><span class="p">);</span>  <span class="c1">// 编译期计算
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="六类模板参数推导ctad" class="headerLink">
    <a href="#%e5%85%ad%e7%b1%bb%e6%a8%a1%e6%9d%bf%e5%8f%82%e6%95%b0%e6%8e%a8%e5%af%bcctad" class="header-mark"></a>6 六、类模板参数推导（CTAD）</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></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">// C++11/14：必须写参数
</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">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">double</span><span class="o">&gt;</span> <span class="n">p1</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mf">2.5</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">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v1</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></span><span class="line"><span class="cl"><span class="c1">// C++17：自动推导
</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">pair</span> <span class="n">p2</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mf">2.5</span><span class="p">);</span>     <span class="c1">// pair&lt;int, double&gt;
</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">vector</span> <span class="n">v2</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="c1">// vector&lt;int&gt;
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="七标准库新增容器" class="headerLink">
    <a href="#%e4%b8%83%e6%a0%87%e5%87%86%e5%ba%93%e6%96%b0%e5%a2%9e%e5%ae%b9%e5%99%a8" class="header-mark"></a>7 七、标准库新增容器</h2><h3 id="71-stdoptional" class="headerLink">
    <a href="#71-stdoptional" class="header-mark"></a>7.1 7.1 <code>std::optional</code></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><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="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">findNum</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="n">x</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">nullopt</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="k">auto</span> <span class="n">res</span> <span class="o">=</span> <span class="n">findNum</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="n">res</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="o">*</span><span class="n">res</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</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="kt">int</span> <span class="n">val</span> <span class="o">=</span> <span class="n">findNum</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">).</span><span class="n">value_or</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="72-stdvariant" class="headerLink">
    <a href="#72-stdvariant" class="header-mark"></a>7.2 7.2 <code>std::variant</code></h3><p>类型安全的 union，访问时用 <code>std::visit</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></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">std</span><span class="o">::</span><span class="n">variant</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">double</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">v</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">v</span> <span class="o">=</span> <span class="mf">3.14</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">v</span> <span class="o">=</span> <span class="s">&#34;hello&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">visit</span><span class="p">([](</span><span class="k">auto</span><span class="o">&amp;&amp;</span> <span class="n">arg</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">arg</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">},</span> <span class="n">v</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="73-stdany" class="headerLink">
    <a href="#73-stdany" class="header-mark"></a>7.3 7.3 <code>std::any</code></h3><p>可以存任意类型的容器，类似 <code>void*</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></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">std</span><span class="o">::</span><span class="n">any</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">42</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">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="s">&#34;hello&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">type</span><span class="p">()</span> <span class="o">==</span> <span class="k">typeid</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</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">std</span><span class="o">::</span><span class="n">any_cast</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</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><hr>
<h2 id="八stdstring_view" class="headerLink">
    <a href="#%e5%85%abstdstring_view" class="header-mark"></a>8 八、<code>std::string_view</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></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">print</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string_view</span> <span class="n">sv</span><span class="p">)</span> <span class="p">{</span>  <span class="c1">// 传 const char* 或 std::string 都不用拷贝
</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">cout</span> <span class="o">&lt;&lt;</span> <span class="n">sv</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</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">print</span><span class="p">(</span><span class="s">&#34;hello&#34;</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">print</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="s">&#34;hi&#34;</span><span class="p">));</span> <span class="c1">// OK
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>注意：</strong> string_view 不拥有数据，源字符串销毁后就悬空了。</p>
<hr>
<h2 id="九文件系统库-stdfilesystem" class="headerLink">
    <a href="#%e4%b9%9d%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f%e5%ba%93-stdfilesystem" class="header-mark"></a>9 九、文件系统库 <code>std::filesystem</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><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;filesystem&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="k">namespace</span> <span class="n">fs</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">filesystem</span><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="n">fs</span><span class="o">::</span><span class="n">create_directory</span><span class="p">(</span><span class="s">&#34;test&#34;</span><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="k">auto</span><span class="o">&amp;</span> <span class="nl">entry</span> <span class="p">:</span> <span class="n">fs</span><span class="o">::</span><span class="n">directory_iterator</span><span class="p">(</span><span class="s">&#34;.&#34;</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">entry</span><span class="p">.</span><span class="n">path</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</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">auto</span> <span class="n">size</span> <span class="o">=</span> <span class="n">fs</span><span class="o">::</span><span class="n">file_size</span><span class="p">(</span><span class="s">&#34;test.txt&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">ext</span> <span class="o">=</span> <span class="n">fs</span><span class="o">::</span><span class="n">path</span><span class="p">(</span><span class="s">&#34;test.txt&#34;</span><span class="p">).</span><span class="n">extension</span><span class="p">();</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%e5%ae%9e%e7%94%a8%e7%89%b9%e6%80%a7" class="header-mark"></a>10 十、其他实用特性</h2><table>
  <thead>
      <tr>
          <th>特性</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>[[nodiscard]]</code></td>
          <td>标记返回值不能忽略，编译器会警告</td>
      </tr>
      <tr>
          <td><code>[[maybe_unused]]</code></td>
          <td>标记可能不用的变量，消除警告</td>
      </tr>
      <tr>
          <td><code>[[fallthrough]]</code></td>
          <td>switch 中显式标注故意 fall-through</td>
      </tr>
      <tr>
          <td>十六进制浮点字面量</td>
          <td><code>0x1.2p3</code></td>
      </tr>
      <tr>
          <td><code>std::as_const</code></td>
          <td>把左值转成 const 引用</td>
      </tr>
      <tr>
          <td><code>std::clamp</code></td>
          <td>把值限制在区间内 <code>clamp(val, min, max)</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></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">// [[nodiscard]] 示例
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="na">[[nodiscard]]</span> <span class="kt">int</span> <span class="n">compute</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">42</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="n">compute</span><span class="p">();</span>  <span class="c1">// 警告：返回值被忽略
</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++17 是<strong>日常开发提升幸福感最多的版本</strong>：</p>
<ul>
<li>结构化绑定 + if-init：代码更简洁</li>
<li>optional/variant/any：类型安全三件套</li>
<li>string_view：字符串处理性能提升</li>
<li>filesystem：终于不用自己写文件操作了</li>
<li>constexpr if：模板元编程变得可读</li>
</ul>
]]></description></item><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>