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

563 lines
88 KiB
HTML

<!DOCTYPE html>
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>&#21046;&#32422;&#19982;&#27010;&#24565;</title>
<link rel="stylesheet" href="ext.css" />
<link rel="stylesheet" href="site_modules.css" />
</head>
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_experimental_constraints skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading">&#21046;&#32422;&#19982;&#27010;&#24565;</h1>
<div id="bodyContent">
<div id="contentSub"><span class="subpages">&lt; <a href="cpp.html">cpp</a>&lrm; | <a href="cpp-experimental.html">experimental</a></span></div>
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
<p><span style="font-size:0.7em; line-height:130%">&#27492;&#39029;&#38754;&#25551;&#36848;&#23454;&#39564;&#24615;&#30340;&#26032;&#35821;&#35328;&#29305;&#24615;&#12290;&#23545;&#20110;&#29992;&#20110;&#26631;&#20934;&#24211;&#35268;&#33539;&#30340;&#20855;&#21517;&#31867;&#22411;&#35201;&#27714;&#65292;&#35265;<a href="cpp-named_req.html">&#20855;&#21517;&#35201;&#27714;</a>&#12290;</span></p>
<p><a href="cpp-language-class_template.html">&#31867;&#27169;&#26495;</a>&#12289;<a href="cpp-language-function_template.html">&#20989;&#25968;&#27169;&#26495;</a>&#21450;&#38750;&#27169;&#26495;&#20989;&#25968;&#65288;&#24120;&#20026;&#31867;&#27169;&#26495;&#25104;&#21592;&#65289;&#21487;&#20197;&#19982;<i>&#21046;&#32422;</i>&#20851;&#32852;&#65292;&#21046;&#32422;&#25351;&#23450;&#27169;&#26495;&#23454;&#21442;&#19978;&#30340;&#35201;&#27714;&#65292;&#36825;&#33021;&#29992;&#20110;&#36873;&#25321;&#26368;&#20934;&#30830;&#30340;&#20989;&#25968;&#37325;&#36733;&#21644;&#27169;&#26495;&#29305;&#21270;&#12290;</p>
<p>&#21046;&#32422;&#20134;&#21487;&#29992;&#20110;&#38480;&#21046;&#21464;&#37327;&#22768;&#26126;&#21644;&#20989;&#25968;&#36820;&#22238;&#31867;&#22411;&#20013;&#30340;&#33258;&#21160;&#31867;&#22411;&#25512;&#23548;&#65292;&#20026;&#21482;&#26377;&#28385;&#36275;&#25351;&#23450;&#35201;&#27714;&#30340;&#31867;&#22411;&#12290;</p>
<p>&#36825;&#31181;&#35201;&#27714;&#30340;&#20855;&#21517;&#38598;&#21512;&#34987;&#31216;&#20026;<i>&#27010;&#24565;</i>&#12290;&#27599;&#20010;&#27010;&#24565;&#37117;&#26159;&#35859;&#35789;&#65292;&#20110;&#32534;&#35793;&#26102;&#27714;&#20540;&#65292;&#24182;&#25104;&#20026;&#27169;&#26495;&#25509;&#21475;&#30340;&#19968;&#37096;&#20998;&#65292;&#23427;&#22312;&#20854;&#20013;&#29992;&#20316;&#21046;&#32422;&#65306;</p>
<div class="t-example">
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;string&gt;</span>
<span class="co2">#include &lt;locale&gt;</span>
<span class="kw1">using</span> <span class="kw1">namespace</span> std<span class="sy4">::</span><span class="me2">literals</span><span class="sy4">;</span>
<span class="co1">// &#27010;&#24565; &quot;EqualityComparable&quot; &#30340;&#22768;&#26126;&#65292;&#20219;&#20309;&#26377;&#35813;&#31867;&#22411;&#20540; a &#21644; b &#65292;</span>
<span class="co1">// &#32780;&#34920;&#36798;&#24335; a==b &#21487;&#32534;&#35793;&#32780;&#20854;&#32467;&#26524;&#21487;&#36716;&#25442;&#20026; bool &#30340; T &#31867;&#22411;&#28385;&#36275;&#23427;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> EqualityComparable <span class="sy1">=</span> requires<span class="br0">(</span>T a, T b<span class="br0">)</span> <span class="br0">{</span>
<span class="br0">{</span> a <span class="sy1">==</span> b <span class="br0">}</span> <span class="sy2">-</span><span class="sy1">&gt;</span> <span class="kw4">bool</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">void</span> f<span class="br0">(</span>EqualityComparable<span class="sy3">&amp;&amp;</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#26377;&#21046;&#32422;&#20989;&#25968;&#27169;&#26495;&#30340;&#22768;&#26126;</span>
<span class="co1">// template&lt;typename T&gt;</span>
<span class="co1">// void f(T&amp;&amp;) requires EqualityComparable&lt;T&gt;; // &#30456;&#21516;&#30340;&#38271;&#24418;&#24335;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
f<span class="br0">(</span><span class="st0">&quot;abc&quot;</span>s<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK &#65306; std::string &#20026; EqualityComparable</span>
f<span class="br0">(</span><a href="cpp-locale-use_facet.html"><span class="kw1897">std::<span class="me2">use_facet</span></span></a><span class="sy1">&lt;</span><a href="cpp-locale-ctype.html"><span class="kw1938">std::<span class="me2">ctype</span></span></a><span class="sy1">&lt;</span><span class="kw4">char</span><span class="sy1">&gt;&gt;</span><span class="br0">(</span><a href="cpp-locale-locale.html"><span class="kw1894">std::<span class="me2">locale</span></span></a><span class="br0">{</span><span class="br0">}</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#38750; EqualityComparable </span>
<span class="br0">}</span></pre></div>
</div>
</div>
<p>&#22312;&#32534;&#35793;&#26102;&#26816;&#27979;&#21046;&#32422;&#36829;&#35268;&#65292;&#26089;&#20110;&#27169;&#26495;&#23454;&#20363;&#21270;&#22788;&#29702;&#65292;&#36825;&#23548;&#33268;&#38169;&#35823;&#20449;&#24687;&#26356;&#26131;&#29702;&#35299;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><a href="cpp-container-list.html"><span class="kw1275">std::<span class="me2">list</span></span></a><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> l <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">3</span>,<span class="sy2">-</span><span class="nu0">1</span>,<span class="nu0">10</span><span class="br0">}</span><span class="sy4">;</span>
<a href="cpp-algorithm-sort.html"><span class="kw1618">std::<span class="me2">sort</span></span></a><span class="br0">(</span>l.<span class="me1">begin</span><span class="br0">(</span><span class="br0">)</span>, l.<span class="me1">end</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
<span class="co1">//&#26080;&#27010;&#24565;&#30340;&#20856;&#22411;&#32534;&#35793;&#22120;&#35786;&#26029;&#65306;</span>
<span class="co1">// invalid operands to binary expression (&#39;std::_List_iterator&lt;int&gt;&#39; and</span>
<span class="co1">// &#39;std::_List_iterator&lt;int&gt;&#39;)</span>
<span class="co1">// std::__lg(__last - __first) * 2);</span>
<span class="co1">// ~~~~~~ ^ ~~~~~~~</span>
<span class="co1">// &hellip;&hellip; 50 &#34892;&#36755;&#20986;&hellip;&hellip;</span>
<span class="co1">//</span>
<span class="co1">//&#26377;&#27010;&#24565;&#30340;&#20856;&#22411;&#32534;&#35793;&#22120;&#35786;&#26029;&#65306;</span>
<span class="co1">// error: cannot call std::sort with std::_List_iterator&lt;int&gt;</span>
<span class="co1">// note: concept RandomAccessIterator&lt;std::_List_iterator&lt;int&gt;&gt; was not satisfied</span></pre></div>
</div>
<p>&#27010;&#24565;&#30340;&#30446;&#30340;&#26159;&#27169;&#25311;&#35821;&#20041;&#31867;&#21035;&#65288; Number &#12289; Range &#12289; RegularFunction &#65289;&#32780;&#38750;&#35821;&#27861;&#21046;&#32422;&#65288; HasPlus &#12289; Array &#65289;&#12290;&#25353;&#29031; <a rel="nofollow" class="external text" href="https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#t20-avoid-concepts-without-meaningful-semantics">ISO C++ &#26680;&#24515;&#26041;&#38024; T.20</a> &#65292;&ldquo;&#19982;&#35821;&#27861;&#21046;&#32422;&#30456;&#21453;&#65292;&#25351;&#23450;&#26377;&#24847;&#20041;&#35821;&#20041;&#30340;&#33021;&#21147;&#26159;&#30495;&#27010;&#24565;&#30340;&#23450;&#20041;&#24615;&#29305;&#24449;&#12290;&rdquo;</p>
<h3><span class="mw-headline" id=".E5.8D.A0.E4.BD.8D.E7.AC.A6">&#21344;&#20301;&#31526;</span></h3>
<p>&#26080;&#21046;&#32422;&#21344;&#20301;&#31526; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">auto</span></span></span> &#19982;&#25317;&#26377;&#24418;&#24335; <span class="t-spar">concept-name</span> <code><b>&lt;</b></code> <span class="t-spar">template-argument-list</span><span class="t-mark">(optional)</span><code><b>&gt;</b></code> &#30340;<i>&#26377;&#21046;&#32422;&#21344;&#20301;&#31526;</i>&#65292;&#26159;&#35201;&#34987;&#25512;&#23548;&#30340;&#31867;&#22411;&#30340;&#21344;&#20301;&#31526;&#12290;</p>
<p>&#21344;&#20301;&#31526;&#21487;&#20986;&#29616;&#20110;&#21464;&#37327;&#22768;&#26126;&#65288;&#35813;&#24773;&#20917;&#19979;&#23427;&#20204;&#20174;&#21021;&#22987;&#21270;&#22120;&#25512;&#23548;&#65289;&#25110;&#20110;&#20989;&#25968;&#36820;&#22238;&#31867;&#22411;&#65288;&#35813;&#24773;&#20917;&#19979;&#23427;&#20204;&#20174; return &#35821;&#21477;&#25512;&#23548;&#65289;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><a href="cpp-utility-pair.html"><span class="kw1096">std::<span class="me2">pair</span></span></a><span class="sy1">&lt;</span><span class="kw4">auto</span>, <span class="kw4">auto</span><span class="sy1">&gt;</span> p2 <span class="sy1">=</span> <a href="cpp-utility-pair-make_pair.html"><span class="kw1097">std::<span class="me2">make_pair</span></span></a><span class="br0">(</span><span class="nu0">0</span>, <span class="st0">&#39;a&#39;</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#31532;&#19968;&#20010; auto &#26159; int,</span>
<span class="co1">// &#31532;&#20108;&#20010; auto &#26159; char</span>
Sortable x <span class="sy1">=</span> f<span class="br0">(</span>y<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// x &#30340;&#31867;&#22411;&#20174; f &#30340;&#36820;&#22238;&#31867;&#22411;&#25512;&#23548;&#65292;&#20165;&#33509;&#31867;&#22411;&#28385;&#36275;&#21046;&#32422; Sortable &#25165;&#33021;&#32534;&#35793;</span>
<span class="kw4">auto</span> f<span class="br0">(</span>Container<span class="br0">)</span> <span class="sy2">-</span><span class="sy1">&gt;</span> Sortable<span class="sy4">;</span> <span class="co1">// &#36820;&#22238;&#31867;&#22411;&#20174; return &#35821;&#21477;&#25512;&#23548;&#65292;&#20165;&#33509;&#31867;&#22411;&#28385;&#36275; Sortable &#25165;&#33021;&#32534;&#35793;</span></pre></div>
</div>
<p>&#21344;&#20301;&#31526;&#20134;&#21487;&#20986;&#29616;&#20110;&#24418;&#21442;&#20013;&#65292;&#35813;&#24773;&#20917;&#19979;&#23427;&#20204;&#23558;&#20989;&#25968;&#22768;&#26126;&#36716;&#21270;&#20026;&#27169;&#26495;&#22768;&#26126;&#65288;&#33509;&#21344;&#20301;&#31526;&#26377;&#21046;&#32422;&#65292;&#21017;&#27169;&#26495;&#22768;&#26126;&#26377;&#21046;&#32422;&#65289;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span>size_t N<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> Even <span class="sy1">=</span> <span class="br0">(</span>N<span class="sy2">%</span><span class="nu19">2</span> <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">void</span> f<span class="br0">(</span><a href="cpp-container-array.html"><span class="kw1268">std::<span class="me2">array</span></span></a><span class="sy1">&lt;</span><span class="kw4">auto</span>, Even<span class="sy1">&gt;</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#36825;&#26159;&#26377;&#20108;&#20010;&#24418;&#21442;&#30340;&#27169;&#26495;&#65306;</span>
<span class="co1">// &#26080;&#21046;&#32422;&#31867;&#22411;&#24418;&#21442;&#21644;&#26377;&#21046;&#32422;&#38750;&#31867;&#22411;&#24418;&#21442;</span></pre></div>
</div>
<p>&#26377;&#21046;&#32422;&#21344;&#20301;&#31526;&#21487;&#29992;&#20110; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">auto</span></span></span> &#33021;&#29992;&#30340;&#20219;&#20309;&#20301;&#32622;&#65292;&#20363;&#22914;&#22312;&#27867;&#22411; lambda &#22768;&#26126;&#20013;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw4">auto</span> gl <span class="sy1">=</span> <span class="br0">[</span><span class="br0">]</span><span class="br0">(</span>Assignable<span class="sy3">&amp;</span> a, <span class="kw4">auto</span><span class="sy2">*</span> b<span class="br0">)</span> <span class="br0">{</span> a <span class="sy1">=</span> <span class="sy2">*</span>b<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<h3><span class="mw-headline" id=".E7.BC.A9.E5.86.99.E7.9A.84.E6.A8.A1.E6.9D.BF">&#32553;&#20889;&#30340;&#27169;&#26495;</span></h3>
<p>&#33509;&#20989;&#25968;&#21442;&#25968;&#21015;&#34920;&#20013;&#20986;&#29616;&#19968;&#25110;&#22810;&#20010;&#21344;&#20301;&#31526;&#65292;&#21017;&#20989;&#25968;&#22768;&#26126;&#23454;&#38469;&#19978;&#26159;&#20989;&#25968;&#27169;&#26495;&#22768;&#26126;&#65292;&#20854;&#27169;&#26495;&#24418;&#21442;&#21015;&#34920;&#20197;&#20986;&#29616;&#39034;&#24207;&#65292;&#20026;&#27599;&#20010;&#21333;&#29420;&#30340;&#21344;&#20301;&#31526;&#21253;&#21547;&#19968;&#20010;&#34394;&#35774;&#30340;&#24418;&#21442;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co1">// &#30701;&#24418;&#24335;</span>
<span class="kw4">void</span> g1<span class="br0">(</span><span class="kw4">const</span> EqualityComparable<span class="sy2">*</span>, Incrementable<span class="sy3">&amp;</span><span class="br0">)</span><span class="sy4">;</span>
<span class="co1">// &#38271;&#24418;&#24335;&#65306;</span>
<span class="co1">// template&lt;EqualityComparable T, Incrementable U&gt; void g1(const T*, U&amp;);</span>
<span class="co1">// &#26356;&#38271;&#24418;&#24335;&#65306;</span>
<span class="co1">// template&lt;typename T, typename U&gt;</span>
<span class="co1">// void g1(const T*, U&amp;) requires EqualityComparable&lt;T&gt; &amp;&amp; Incrementable&lt;U&gt;;</span>
<span class="kw4">void</span> f2<span class="br0">(</span><a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1">&lt;</span><span class="kw4">auto</span><span class="sy2">*</span><span class="sy1">&gt;</span>...<span class="br0">)</span><span class="sy4">;</span>
<span class="co1">// &#38271;&#24418;&#24335;&#65306; template&lt;typename... T&gt; void f2(std::vector&lt;T*&gt;...);</span>
<span class="kw4">void</span> f4<span class="br0">(</span><span class="kw4">auto</span> <span class="br0">(</span>auto<span class="sy4">::</span><span class="sy2">*</span><span class="br0">)</span><span class="br0">(</span><span class="kw4">auto</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
<span class="co1">// &#38271;&#24418;&#24335;&#65306; template&lt;typename T, typename U, typename V&gt; void f4(T (U::*)(V));</span></pre></div>
</div>
<p>&#31561;&#20215;&#30340;&#26377;&#21046;&#32422;&#31867;&#22411;&#25351;&#23450;&#31526;&#25152;&#24341;&#20837;&#30340;&#25152;&#26377;&#21344;&#20301;&#31526;&#25317;&#26377;&#21516;&#19968;&#34394;&#35774;&#27169;&#26495;&#24418;&#21442;&#12290;&#28982;&#32780;&#65292;&#27599;&#20010;&#26080;&#21046;&#32422;&#25351;&#23450;&#31526;&#65288; <code>auto</code> &#65289;&#22987;&#32456;&#24341;&#20837;&#19968;&#20010;&#30456;&#24322;&#30340;&#27169;&#26495;&#24418;&#21442;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw4">void</span> f0<span class="br0">(</span>Comparable a, Comparable<span class="sy2">*</span> b<span class="br0">)</span><span class="sy4">;</span>
<span class="co1">// &#38271;&#24418;&#24335;&#65306; template&lt;Comparable T&gt; void f0(T a, T* b);</span>
<span class="kw4">void</span> f1<span class="br0">(</span><span class="kw4">auto</span> a, <span class="kw4">auto</span><span class="sy2">*</span> b<span class="br0">)</span><span class="sy4">;</span>
<span class="co1">// &#38271;&#24418;&#24335;&#65306; template&lt;typename T, typename U&gt; f1(T a, U* b);</span></pre></div>
</div>
<p>&#20989;&#25968;&#27169;&#26495;&#19982;&#31867;&#27169;&#26495;&#37117;&#33021;&#29992;<i>&#27169;&#26495;&#24341;&#20837;</i>&#22768;&#26126;&#65292;&#23427;&#26377;&#35821;&#27861; <span class="t-spar">concept-name</span> <code><b>{</b></code> <span class="t-spar">parameter-list</span><span class="t-mark">(&#21487;&#36873;)</span><code><b>}</b></code> &#65292;&#27492;&#24773;&#20917;&#20013;&#19981;&#38656;&#35201;&#20851;&#38190;&#35789; <code>template</code> &#65306;&#26469;&#33258;&#27169;&#26495;&#24341;&#20837;&#30340; <span class="t-spar">parameter-list</span> &#30340;&#27599;&#20010;&#24418;&#21442;&#37117;&#25104;&#20026;&#27169;&#26495;&#24418;&#21442;&#65292;&#20854;&#31181;&#31867;&#65288;&#31867;&#22411;&#12289;&#38750;&#31867;&#22411;&#12289;&#27169;&#26495;&#65289;&#20197;&#20855;&#21517;&#27010;&#24565;&#20013;&#23545;&#24212;&#24418;&#21442;&#30340;&#31181;&#31867;&#30830;&#23450;&#12290;</p>
<p>&#38500;&#20102;&#22768;&#26126;&#27169;&#26495;&#65292;&#27169;&#26495;&#24341;&#20837;&#20851;&#32852;&#19968;&#20010;<i>&#35859;&#35789;&#21046;&#32422;</i>&#65288;&#35265;&#21518;&#36848;&#65289;&#65292;&#23427;&#25351;&#21517;&#65288;&#23545;&#20110;&#21464;&#37327;&#27010;&#24565;&#65289;&#25110;&#35843;&#29992;&#65288;&#23545;&#20110;&#20989;&#25968;&#27010;&#24565;&#65289;&#35813;&#24341;&#20837;&#25152;&#25351;&#21517;&#30340;&#27010;&#24565;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1">EqualityComparable<span class="br0">{</span>T<span class="br0">}</span> <span class="kw1">class</span> Foo<span class="sy4">;</span>
<span class="co1">// &#38271;&#24418;&#24335;&#65306; template&lt;EqualityComparable T&gt; class Foo;</span>
<span class="co1">// &#26356;&#38271;&#24418;&#24335;&#65306; template&lt;typename T&gt; requires EqualityComparable&lt;T&gt; class Foo;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T, <span class="kw4">int</span> N, <span class="kw1">typename</span>... <span class="me1">Xs</span><span class="sy1">&gt;</span> concept <span class="kw4">bool</span> Example <span class="sy1">=</span> ...<span class="sy4">;</span>
Example<span class="br0">{</span>A, B, ...<span class="me1">C</span><span class="br0">}</span> <span class="kw1">struct</span> S1<span class="sy4">;</span>
<span class="co1">// &#38271;&#24418;&#24335;&#65306; template&lt;class A, int B, class... C&gt; requires Example&lt;A,B,C...&gt; struct S1;</span></pre></div>
</div>
<p>&#23545;&#20110;&#20989;&#25968;&#27169;&#26495;&#65292;&#27169;&#26495;&#24341;&#20837;&#33021;&#19982;&#21344;&#20301;&#31526;&#32452;&#21512;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1">Sortable<span class="br0">{</span>T<span class="br0">}</span> <span class="kw4">void</span> f<span class="br0">(</span>T, <span class="kw4">auto</span><span class="br0">)</span><span class="sy4">;</span>
<span class="co1">// &#38271;&#24418;&#24335;&#65306; template&lt;Sortable T, typename U&gt; void f(T, U);</span>
<span class="co1">// &#21478;&#19968;&#31181;&#21482;&#29992;&#21344;&#20301;&#31526;&#30340;&#24418;&#24335;&#65306; void f(Sortable, auto);</span></pre></div>
</div>
<table class="metadata plainlinks ambox mbox-small-left ambox-notice" style="">
<tr>
<td class="mbox-empty-cell"></td>
<td class="mbox-text" style="">&#26412;&#33410;&#26410;&#23436;&#25104;<br />
&#21407;&#22240;&#65306;&#28070;&#33394;&#27169;&#26495;&#22768;&#26126;&#39029;&#38754;&#24182;&#38142;&#25509;&#33267;&#27492;</td>
</tr>
</table>
<h3><span class="mw-headline" id=".E6.A6.82.E5.BF.B5">&#27010;&#24565;</span></h3>
<p>&#27010;&#24565;&#26159;&#20855;&#21517;&#35201;&#27714;&#38598;&#21512;&#12290;&#27010;&#24565;&#30340;&#23450;&#20041;&#20986;&#29616;&#20110;&#21629;&#21517;&#31354;&#38388;&#20316;&#29992;&#22495;&#65292;&#24182;&#25317;&#26377;<a href="cpp-language-function_template.html">&#20989;&#25968;&#27169;&#26495;</a>&#23450;&#20041;&#65288;&#35813;&#24773;&#20917;&#19979;&#31216;&#20026;<i>&#20989;&#25968;&#27010;&#24565;</i>&#65289;&#25110;<a href="cpp-language-variable_template.html">&#21464;&#37327;&#27169;&#26495;</a>&#23450;&#20041;&#65288;&#35813;&#24773;&#20917;&#19979;&#31216;&#20026;<i>&#21464;&#37327;&#27010;&#24565;</i>&#65289;&#30340;&#24418;&#24335;&#12290;&#20165;&#26377;&#30340;&#21306;&#21035;&#26159;&#20851;&#38190;&#35789; <span class="t-c"><span class="mw-geshi cpp source-cpp">concept</span></span> &#20986;&#29616;&#20110; <span class="t-spar">decl-specifier-seq</span> &#20013;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co1">// &#26469;&#33258;&#26631;&#20934;&#65288;&#33539;&#22260; TS &#65289;&#30340;&#21464;&#37327;&#27010;&#24565;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span> T, <span class="kw1">class</span> U<span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> Derived <span class="sy1">=</span> <a href="cpp-types-is_base_of.html"><span class="kw590">std::<span class="me2">is_base_of</span></span></a><span class="sy1">&lt;</span>U, T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">value</span><span class="sy4">;</span>
<span class="co1">// &#26469;&#33258;&#26631;&#20934;&#65288;&#33539;&#22260; TS &#65289;&#30340;&#20989;&#25968;&#27010;&#24565;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> EqualityComparable<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">return</span> requires<span class="br0">(</span>T a, T b<span class="br0">)</span> <span class="br0">{</span> <span class="br0">{</span>a <span class="sy1">==</span> b<span class="br0">}</span> <span class="sy2">-</span><span class="sy1">&gt;</span> Boolean<span class="sy4">;</span> <span class="br0">{</span>a <span class="sy3">!</span><span class="sy1">=</span> b<span class="br0">}</span> <span class="sy2">-</span><span class="sy1">&gt;</span> Boolean<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#19979;&#21015;&#38480;&#21046;&#24212;&#29992;&#20110;&#20989;&#25968;&#27010;&#24565;&#65306;</p>
<ul>
<li>&#19981;&#20801;&#35768; <code>inline</code> &#19982; <code>constexpr</code> &#65292;&#20989;&#25968;&#33258;&#21160;&#20026; <code>inline</code> &#19982; <code>constexpr</code></li>
<li>&#19981;&#20801;&#35768; <code>friend</code> &#19982; <code>virtual</code></li>
<li>&#19981;&#20801;&#35768;&#24322;&#24120;&#35268;&#23450;&#65292;&#20989;&#25968;&#33258;&#21160;&#20026; <code>noexcept(true)</code> &#12290;</li>
<li>&#19981;&#33021;&#22768;&#26126;&#24182;&#24310;&#36831;&#23450;&#20041;&#65292;&#19981;&#33021;&#37325;&#22768;&#26126;</li>
<li>&#36820;&#22238;&#31867;&#22411;&#24517;&#39035;&#26159; <code>bool</code></li>
<li>&#19981;&#20801;&#35768;&#36820;&#22238;&#31867;&#22411;&#25512;&#23548;</li>
<li>&#21442;&#25968;&#21015;&#34920;&#24517;&#39035;&#20026;&#31354;</li>
<li>&#20989;&#25968;&#20307;&#24517;&#39035;&#20165;&#30001;&#19968;&#26465; <code>return</code> &#35821;&#21477;&#32452;&#25104;&#65292;&#20854;&#21442;&#25968;&#24517;&#39035;&#26159;&#19968;&#26465;<i>&#21046;&#32422;&#34920;&#36798;&#24335;</i>&#65288;&#35859;&#35789;&#21046;&#32422;&#12289;&#20854;&#20182;&#21046;&#32422;&#30340;&#21512;&#21462;/&#26512;&#21462;&#25110; requires &#34920;&#36798;&#24335;&#65292;&#35265;&#21518;&#36848;&#65289;</li>
</ul>
<p>&#19979;&#21015;&#38480;&#21046;&#24212;&#29992;&#20110;&#21464;&#37327;&#27010;&#24565;&#65306;</p>
<ul>
<li>&#24517;&#39035;&#26377;&#31867;&#22411; <code>bool</code></li>
<li>&#19981;&#33021;&#22768;&#26126;&#20026;&#26080;&#21021;&#22987;&#21270;&#22120;</li>
<li>&#19981;&#20801;&#35768; <code>constexpr</code> &#65292;&#21464;&#37327;&#33258;&#21160;&#20026; <code>constexpr</code></li>
<li>&#21021;&#22987;&#21270;&#22120;&#24517;&#39035;&#26159;&#21046;&#32422;&#34920;&#36798;&#24335;&#65288;&#35859;&#35789;&#21046;&#32422;&#12289;&#20854;&#20182;&#21046;&#32422;&#30340;&#21512;&#21462;/&#26512;&#21462;&#25110; requires &#34920;&#36798;&#24335;&#65292;&#35265;&#21518;&#36848;&#65289;</li>
</ul>
<p>&#27010;&#24565;&#19981;&#33021;&#22312;&#20989;&#25968;&#20307;&#20869;&#25110;&#21464;&#37327;&#21021;&#22987;&#21270;&#22120;&#20869;&#36882;&#24402;&#22320;&#25351;&#28041;&#33258;&#36523;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> F<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> F<span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy4">::</span><span class="me2">type</span><span class="sy1">&gt;</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// &#38169;&#35823;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> V <span class="sy1">=</span> V<span class="sy1">&lt;</span>T<span class="sy2">*</span><span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;</span></pre></div>
</div>
<p>&#27010;&#24565;&#23450;&#20041;&#19981;&#33021;&#26377;&#20851;&#32852;&#30340;&#21046;&#32422;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> C1 <span class="sy1">=</span> <span class="kw2">true</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>C1 T<span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> Error1 <span class="sy1">=</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;C1 T &#22768;&#26126;&#20102;&#19968;&#20010;&#20851;&#32852;&#30340;&#21046;&#32422;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span> requires C1<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> Error2 <span class="sy1">=</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;requires &#23376;&#21477;&#22768;&#26126;&#20102;&#19968;&#20010;&#20851;&#32852;&#30340;&#21046;&#32422;</span></pre></div>
</div>
<p>&#19981;&#20801;&#35768;&#27010;&#24565;&#30340;&#26174;&#24335;&#23454;&#20363;&#21270;&#12289;&#26174;&#24335;&#29305;&#21270;&#25110;&#37096;&#20998;&#29305;&#21270;&#65288;&#19981;&#33021;&#26356;&#25913;&#21046;&#32422;&#30340;&#21407;&#21021;&#23450;&#20041;&#30340;&#24847;&#20041;&#65289;&#12290;</p>
<h3><span class="mw-headline" id=".E5.88.B6.E7.BA.A6">&#21046;&#32422;</span></h3>
<p>&#21046;&#32422;&#26159;&#19968;&#31995;&#21015;&#36923;&#36753;&#36816;&#31639;&#65292;&#23427;&#25351;&#23450;&#27169;&#26495;&#23454;&#21442;&#19978;&#30340;&#35201;&#27714;&#12290;&#23427;&#20204;&#21487;&#20986;&#29616;&#20110; <i>requires &#34920;&#36798;&#24335;</i>&#65288;&#35265;&#21518;&#36848;&#65289;&#20013;&#65292;&#21450;&#30452;&#25509;&#20316;&#20026;&#27010;&#24565;&#30340;&#20307;&#12290;</p>
<p>&#21046;&#32422;&#26377; 9 &#31181;&#31867;&#22411;&#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> &#21512;&#21462;</div>
<div class="t-li1"><span class="t-li">2)</span> &#26512;&#21462;</div>
<div class="t-li1"><span class="t-li">3)</span> &#35859;&#35789;&#21046;&#32422;</div>
<div class="t-li1"><span class="t-li">4)</span> &#34920;&#36798;&#24335;&#21046;&#32422;&#65288;&#20165;&#22312; <i>requires &#34920;&#36798;&#24335;</i>&#20013;&#65289;</div>
<div class="t-li1"><span class="t-li">5)</span> &#31867;&#22411;&#21046;&#32422;&#65288;&#20165;&#22312; <i>requires &#34920;&#36798;&#24335;</i>&#20013;&#65289;</div>
<div class="t-li1"><span class="t-li">6)</span> &#38544;&#24335;&#36716;&#25442;&#21046;&#32422;&#65288;&#20165;&#22312; <i>requires &#34920;&#36798;&#24335;</i>&#20013;&#65289;</div>
<div class="t-li1"><span class="t-li">7)</span> &#23454;&#21442;&#25512;&#23548;&#21046;&#32422;&#65288;&#20165;&#22312; <i>requires &#34920;&#36798;&#24335;</i>&#20013;&#65289;</div>
<div class="t-li1"><span class="t-li">8)</span> &#24322;&#24120;&#21046;&#32422;&#65288;&#20165;&#22312; <i>requires &#34920;&#36798;&#24335;</i>&#20013;&#65289;</div>
<div class="t-li1"><span class="t-li">9)</span> &#21442;&#25968;&#21270;&#21046;&#32422;&#65288;&#20165;&#22312; <i>requires &#34920;&#36798;&#24335;</i>&#20013;&#65289;</div>
<p>&#21069;&#19977;&#20010;&#31867;&#22411;&#30340;&#21046;&#32422;&#21487;&#20197;&#30452;&#25509;&#20316;&#20026;&#27010;&#24565;&#30340;&#20307;&#65292;&#25110;&#20316;&#20026;&#38543;&#21363;&#30340; requires &#23376;&#21477;&#20986;&#29616;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
requires <span class="co1">// requires &#23376;&#21477;&#65288;&#38543;&#21363;&#30340;&#21046;&#32422;&#65289;</span>
sizeof<span class="br0">(</span>T<span class="br0">)</span> <span class="sy1">&gt;</span> <span class="nu0">1</span> <span class="sy3">&amp;&amp;</span> get_value<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">(</span><span class="br0">)</span> <span class="co1">// &#20108;&#20010;&#35859;&#35789;&#21046;&#32422;&#30340;&#21512;&#21462;</span>
<span class="kw4">void</span> f<span class="br0">(</span>T<span class="br0">)</span><span class="sy4">;</span></pre></div>
</div>
<p>&#38468;&#30528;&#22810;&#20010;&#21046;&#32422;&#21040;&#21516;&#19968;&#22768;&#26126;&#26102;&#65292;&#24635;&#21046;&#32422;&#26159;&#25353;&#19979;&#21015;&#39034;&#24207;&#30340;&#21512;&#21462;&#65306;<i>&#27169;&#26495;&#24341;&#20837;</i>&#25152;&#24341;&#20837;&#30340;&#21046;&#32422;&#12289;&#25353;&#20986;&#29616;&#39034;&#24207;&#30340;&#27599;&#20010;&#27169;&#26495;&#24418;&#21442;&#30340;&#21046;&#32422;&#12289;&#27169;&#26495;&#24418;&#21442;&#21015;&#34920;&#21518;&#30340; <i>requires</i> &#23376;&#21477;&#12289;&#25353;&#20986;&#29616;&#39034;&#24207;&#30340;&#27599;&#20010;&#20989;&#25968;&#21442;&#25968;&#30340;&#21046;&#32422;&#12289;&#23614;&#38543;&#30340; <i>requires</i> &#23376;&#21477;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co1">// &#22768;&#26126;&#29992;&#21046;&#32422; Incrementable&lt;T&gt; &amp;&amp; Decrementable&lt;T&gt; &#22768;&#26126;&#21516;&#19968;&#26377;&#21046;&#32422;&#20989;&#25968;&#27169;&#26495; </span>
<span class="kw1">template</span><span class="sy1">&lt;</span>Incrementable T<span class="sy1">&gt;</span>
<span class="kw4">void</span> f<span class="br0">(</span>T<span class="br0">)</span> requires Decrementable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
requires Incrementable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="sy3">&amp;&amp;</span> Decrementable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span>
<span class="kw4">void</span> f<span class="br0">(</span>T<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK</span>
<span class="co1">// &#19979;&#21015;&#20108;&#20010;&#22768;&#26126;&#25317;&#26377;&#19981;&#21516;&#21046;&#32422;&#65306;</span>
<span class="co1">// &#31532;&#19968;&#20010;&#22768;&#26126;&#26377; Incrementable&lt;T&gt; &amp;&amp; Decrementable&lt;T&gt;</span>
<span class="co1">// &#31532;&#20108;&#20010;&#22768;&#26126;&#26377; Decrementable&lt;T&gt; &amp;&amp; Incrementable&lt;T&gt;</span>
<span class="co1">// &#23613;&#31649;&#23427;&#20204;&#36923;&#36753;&#31561;&#20215;&#12290;</span>
<span class="co1">// &#31532;&#20108;&#20010;&#22768;&#26126;&#20026;&#30149;&#24335;&#65292;&#19981;&#35201;&#27714;&#35786;&#26029;&#12290;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>Incrementable T<span class="sy1">&gt;</span> requires Decrementable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>Decrementable T<span class="sy1">&gt;</span> requires Incrementable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;</span></pre></div>
</div>
<h4><span class="mw-headline" id=".E5.90.88.E5.8F.96">&#21512;&#21462;</span></h4>
<p>&#20197; <span class="t-c"><span class="mw-geshi cpp source-cpp">P <span class="sy3">&amp;&amp;</span> Q</span></span> &#25351;&#23450;&#21046;&#32422; <code>P</code> &#19982; <code>Q</code> &#30340;&#21512;&#21462;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co1">// &#26469;&#33258;&#26631;&#20934;&#24211;&#65288;&#33539;&#22260; TS&#65289;&#30340;&#31034;&#20363;&#27010;&#24565;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> Integral <span class="sy1">=</span> <a href="cpp-types-is_integral.html"><span class="kw456">std::<span class="me2">is_integral</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">value</span><span class="sy4">;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> SignedIntegral <span class="sy1">=</span> Integral<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="sy3">&amp;&amp;</span> <a href="cpp-types-is_signed.html"><span class="kw516">std::<span class="me2">is_signed</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">value</span><span class="sy4">;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> UnsignedIntegral <span class="sy1">=</span> Integral<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="sy3">&amp;&amp;</span> <span class="sy3">!</span>SignedIntegral<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">;</span></pre></div>
</div>
<p>&#20108;&#20010;&#21046;&#32422;&#30340;&#21512;&#21462;&#65292;&#20165;&#33509;&#20108;&#20010;&#21046;&#32422;&#22343;&#24471;&#21040;&#28385;&#36275;&#25165;&#24471;&#21040;&#28385;&#36275;&#12290;&#21512;&#21462;&#20174;&#24038;&#21040;&#21491;&#19988;&#20026;&#30701;&#36335;&#27714;&#20540;&#65288;&#33509;&#19981;&#28385;&#36275;&#24038;&#20391;&#21046;&#32422;&#65292;&#21017;&#19981;&#23581;&#35797;&#23545;&#21491;&#20391;&#21046;&#32422;&#30340;&#27169;&#26495;&#23454;&#21442;&#26367;&#25442;&#65306;&#36825;&#38459;&#27490;&#31435;&#21363;&#35821;&#22659;&#20043;&#22806;&#26367;&#25442;&#23548;&#33268;&#30340;&#22833;&#36133;&#65289;&#12290;&#21046;&#32422;&#21512;&#21462;&#20013;&#19981;&#20801;&#35768;&#29992;&#25143;&#23450;&#20041;&#30340; <code>operator&amp;&amp;</code> &#37325;&#36733;&#12290;</p>
<h4><span class="mw-headline" id=".E6.9E.90.E5.8F.96">&#26512;&#21462;</span></h4>
<p>&#20197; <span class="t-c"><span class="mw-geshi cpp source-cpp">P <span class="sy3">||</span> Q</span></span> &#25351;&#23450;&#21046;&#32422; <code>P</code> &#19982; <code>Q</code> &#30340;&#26512;&#21462;&#12290;</p>
<p>&#33509;&#20219;&#19968;&#21046;&#32422;&#24471;&#21040;&#28385;&#36275;&#65292;&#21017;&#20108;&#20010;&#21046;&#32422;&#30340;&#26512;&#21462;&#30340;&#21040;&#28385;&#36275;&#12290;&#26512;&#21462;&#20174;&#24038;&#21040;&#21491;&#19988;&#20026;&#30701;&#36335;&#27714;&#20540;&#65288;&#33509;&#28385;&#36275;&#24038;&#20391;&#21046;&#32422;&#65292;&#21017;&#19981;&#23581;&#35797;&#23545;&#21491;&#20391;&#21046;&#32422;&#30340;&#27169;&#26495;&#23454;&#21442;&#26367;&#25442;&#65289;&#12290;&#21046;&#32422;&#26512;&#21462;&#20013;&#19981;&#20801;&#35768;&#29992;&#25143;&#23450;&#20041;&#30340; <code>operator||</code> &#37325;&#36733;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co1">// &#26469;&#33258;&#26631;&#20934;&#24211;&#65288;&#33539;&#22260; TS &#65289;&#30340;&#31034;&#20363;&#21046;&#32422;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span> T <span class="sy1">=</span> <span class="kw4">void</span><span class="sy1">&gt;</span>
requires EqualityComparable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">(</span><span class="br0">)</span> <span class="sy3">||</span> Same<span class="sy1">&lt;</span>T, <span class="kw4">void</span><span class="sy1">&gt;</span>
<span class="kw1">struct</span> equal_to<span class="sy4">;</span></pre></div>
</div>
<h4><span class="mw-headline" id=".E8.B0.93.E8.AF.8D.E5.88.B6.E7.BA.A6">&#35859;&#35789;&#21046;&#32422;</span></h4>
<p>&#35859;&#35789;&#21046;&#32422;&#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span> &#31867;&#22411;&#30340;&#24120;&#37327;&#34920;&#36798;&#24335;&#12290;&#23427;&#20165;&#33509;&#27714;&#20540;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> &#25165;&#24471;&#21040;&#28385;&#36275;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> Size32 <span class="sy1">=</span> sizeof<span class="br0">(</span>T<span class="br0">)</span> <span class="sy1">==</span> <span class="nu0">4</span><span class="sy4">;</span></pre></div>
</div>
<p>&#35859;&#35789;&#21046;&#32422;&#33021;&#25351;&#23450;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#19978;&#21644;&#27169;&#26495;&#27169;&#26495;&#23454;&#21442;&#19978;&#30340;&#35201;&#27714;&#12290;</p>
<p>&#35859;&#35789;&#21046;&#32422;&#24517;&#39035;&#30452;&#25509;&#27714;&#20540;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span> &#65292;&#19981;&#20801;&#35768;&#36716;&#25442;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> <span class="kw1">struct</span> S <span class="br0">{</span>
<span class="kw4">constexpr</span> <span class="kw1">explicit</span> operator <span class="kw4">bool</span><span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
requires S<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">{</span><span class="br0">}</span> <span class="co1">// &#22351;&#30340;&#35859;&#35789;&#21046;&#32422;&#65306; S&lt;T&gt;{} &#19981;&#26159; bool</span>
<span class="kw4">void</span> f<span class="br0">(</span>T<span class="br0">)</span><span class="sy4">;</span>
f<span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#20915;&#19981;&#28385;&#36275;&#21046;&#32422;</span></pre></div>
</div>
<h3><span class="mw-headline" id=".E8.A6.81.E6.B1.82">&#35201;&#27714;</span></h3>
<p>&#20851;&#38190;&#35789; <span class="t-c"><span class="mw-geshi cpp source-cpp">requires</span></span> &#26377;&#20108;&#31181;&#20351;&#29992;&#26041;&#24335;&#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> &#24341;&#20837; <i>requires &#23376;&#21477;</i>&#65292;&#23427;&#25351;&#23450;&#27169;&#26495;&#23454;&#21442;&#25110;&#20989;&#25968;&#22768;&#26126;&#19978;&#30340;&#21046;&#32422;&#12290;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
<span class="kw4">void</span> f<span class="br0">(</span>T<span class="sy3">&amp;&amp;</span><span class="br0">)</span> requires Eq<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// &#33021;&#20316;&#20026;&#20989;&#25968;&#22768;&#26126;&#22120;&#30340;&#26368;&#26411;&#20803;&#32032;&#20986;&#29616;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> requires Addable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="co1">// &#25110;&#22312;&#27169;&#26495;&#24418;&#21442;&#21015;&#34920;&#20043;&#21491;</span>
T add<span class="br0">(</span>T a, T b<span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> a <span class="sy2">+</span> b<span class="sy4">;</span> <span class="br0">}</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li"></span> &#27492;&#24773;&#20917;&#19979;&#65292;&#20851;&#38190;&#35789; <i>requires</i> &#24517;&#39035;&#20026;&#26576;&#20010;&#24120;&#37327;&#34920;&#36798;&#24335;&#25152;&#21518;&#38543;&#65288;&#25925;&#21487;&#20197;&#20889; &quot;requires true;&quot; &#65289;&#65292;&#20294;&#20854;&#24847;&#22270;&#26159;&#20351;&#29992;&#20855;&#21517;&#27010;&#24565;&#65288;&#22914;&#19978;&#36848;&#31034;&#20363;&#20013;&#65289;&#25110;&#20855;&#21517;&#27010;&#24565;&#30340;&#21512;&#21462;/&#26512;&#21462;&#25110; <i>requires &#34920;&#36798;&#24335;</i>&#12290;</div>
<div class="t-li1"><span class="t-li">2)</span> &#24320;&#22987; <i>requires &#34920;&#36798;&#24335;</i>&#65292;&#23427;&#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span> &#31867;&#22411;&#32431;&#21491;&#20540;&#65292;&#25551;&#36848;&#26576;&#20123;&#27169;&#26495;&#23454;&#21442;&#19978;&#30340;&#21046;&#32422;&#12290;&#33509;&#28385;&#36275;&#23545;&#24212;&#27010;&#24565;&#21017;&#36825;&#31181;&#34920;&#36798;&#24335;&#20026; <code>true</code> &#65292;&#21542;&#21017;&#20026; false &#65306;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> Addable <span class="sy1">=</span> requires <span class="br0">(</span>T x<span class="br0">)</span> <span class="br0">{</span> x <span class="sy2">+</span> x<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// requires &#34920;&#36798;&#24335;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> requires Addable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="co1">// requires &#23376;&#21477;&#65292;&#38750; requires &#34920;&#36798;&#24335;</span>
T add<span class="br0">(</span>T a, T b<span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> a <span class="sy2">+</span> b<span class="sy4">;</span> <span class="br0">}</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
requires requires <span class="br0">(</span>T x<span class="br0">)</span> <span class="br0">{</span> x <span class="sy2">+</span> x<span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// &#38543;&#21363;&#21046;&#32422;&#65292;&#27880;&#24847;&#20351;&#29992;&#20108;&#27425;&#20851;&#38190;&#23383;</span>
T add<span class="br0">(</span>T a, T b<span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> a <span class="sy2">+</span> b<span class="sy4">;</span> <span class="br0">}</span></pre></div>
</div>
</div>
<p><i>requires &#34920;&#36798;&#24335;</i>&#30340;&#35821;&#27861;&#22914;&#19979;&#65306;</p>
<table class="t-sdsc-begin">
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td class="t-sdsc-nopad"><code><b>requires</b></code> <code><b>(</b></code> <span class="t-spar">parameter-list</span><span class="t-mark">(&#21487;&#36873;)</span> <code><b>)</b></code> <code><b>{</b></code> <span class="t-spar">requirement-seq</span> <code><b>}</b></code></td>
<td class="t-sdsc-nopad"></td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
</table>
<table class="t-par-begin">
<tr class="t-par">
<td><span class="t-spar">parameter-list</span></td>
<td>-</td>
<td>&#36887;&#21495;&#20998;&#38548;&#21015;&#34920;&#65292;&#22914;&#22312;&#20989;&#25968;&#22768;&#26126;&#20013;&#65292;&#38500;&#20102;&#19981;&#20801;&#35768;&#40664;&#35748;&#21442;&#25968;&#65292;&#19988;&#26368;&#21518;&#30340;&#21442;&#25968;&#19981;&#33021;&#26159;&#30465;&#30053;&#21495;&#12290;&#36825;&#20123;&#21442;&#25968;&#26080;&#23384;&#20648;&#26399;&#12289;&#38142;&#25509;&#25110;&#29983;&#23384;&#26399;&#12290;&#36825;&#20123;&#21442;&#25968;&#22312; <span class="t-spar">requirement-seq</span> &#30340;&#38381; <code><b>}</b></code> &#21069;&#22788;&#20110;&#20316;&#29992;&#22495;&#20013;&#12290;&#33509;&#19981;&#20351;&#29992;&#21442;&#25968;&#65292;&#21017;&#29615;&#32469;&#30340;&#25324;&#21495;&#20134;&#21487;&#30465;&#30053;</td>
</tr>
<tr class="t-par">
<td><span class="t-spar">requirement-seq</span></td>
<td>-</td>
<td><i>&#35201;&#27714;</i>&#30340;&#31354;&#30333;&#31526;&#20998;&#38548;&#24207;&#21015;&#65292;&#25551;&#36848;&#20110;&#19979;&#65288;&#27599;&#20010;&#35201;&#27714;&#20197;&#20998;&#21495;&#32467;&#23614;&#65289;&#12290;&#27599;&#20010;&#35201;&#27714;&#28155;&#21152;&#21478;&#19968;&#21046;&#32422;&#21040;&#27492; requires &#34920;&#36798;&#24335;&#25152;&#23450;&#20041;&#30340;&#21046;&#32422;<i>&#21512;&#21462;</i>&#12290;</td>
</tr>
</table>
<p><span class="t-spar">requirements-seq</span> &#20013;&#30340;&#27599;&#20010;&#35201;&#27714;&#26159;&#19979;&#21015;&#20043;&#19968;&#65306;</p>
<ul>
<li>&#31616;&#21333;&#35201;&#27714;</li>
<li>&#31867;&#22411;&#35201;&#27714;</li>
<li>&#22797;&#21512;&#35201;&#27714;</li>
<li>&#23884;&#22871;&#35201;&#27714;</li>
</ul>
<p>&#35201;&#27714;&#21487;&#20197;&#25552;&#21450;&#22312;&#20316;&#29992;&#22495;&#20013;&#30340;&#27169;&#26495;&#24418;&#21442;&#65292;&#21644;&#20110; <span class="t-spar">parameter-list</span> &#24341;&#20837;&#30340;&#23616;&#37096;&#21442;&#25968;&#12290;&#22312;&#21442;&#25968;&#21270;&#26102;&#65292;&#31216; requires &#34920;&#36798;&#24335;&#24341;&#20837;&#19968;&#20010;<i>&#21442;&#25968;&#21270;&#21046;&#32422;</i>&#12290;</p>
<p>&#26367;&#25442;&#27169;&#26495;&#23454;&#21442;&#21040;&#33267; reqiures &#34920;&#36798;&#24335;&#21487;&#33021;&#23548;&#33268;&#20110;&#20854;&#35201;&#27714;&#20013;&#24418;&#25104;&#38750;&#27861;&#31867;&#22411;&#25110;&#34920;&#36798;&#24335;&#12290;&#36825;&#20123;&#24773;&#20917;&#19979;&#65292;</p>
<ul>
<li>&#33509;&#26367;&#25442;&#22833;&#36133;&#20986;&#29616;&#20110;&#29992;&#20110;<a href="cpp-language-templates.html#.E6.A8.A1.E6.9D.BF.E5.8C.96.E5.AE.9E.E4.BD.93">&#27169;&#26495;&#21270;&#23454;&#20307;</a>&#22768;&#26126;&#20043;&#22806;&#30340; requires &#34920;&#36798;&#24335;&#65292;&#21017;&#31243;&#24207;&#20026;&#30149;&#24335;&#12290;</li>
<li>&#33509; requires &#34920;&#36798;&#24335;&#29992;&#20110;<a href="cpp-language-templates.html#.E6.A8.A1.E6.9D.BF.E5.8C.96.E5.AE.9E.E4.BD.93">&#27169;&#26495;&#21270;&#23454;&#20307;</a>&#30340;&#22768;&#26126;&#20013;&#65292;&#21017;&#23545;&#24212;&#30340;&#21046;&#32422;&#34987;&#24403;&#20570;&ldquo;&#19981;&#28385;&#36275;&rdquo;&#32780;<a href="cpp-language-sfinae.html">&#26367;&#25442;&#22833;&#36133;&#19981;&#26159;&#38169;&#35823;</a>&#65292;&#28982;&#32780;</li>
<li>&#33509;&#26367;&#25442;&#22833;&#36133;&#20250;&#22312;&#23545;&#27599;&#20010;&#21487;&#33021;&#27169;&#26495;&#23454;&#21442;&#30340; requires &#34920;&#36798;&#24335;&#20013;&#20986;&#29616;&#65292;&#21017;&#31243;&#24207;&#20026;&#30149;&#24335;&#65292;&#19981;&#35201;&#27714;&#35786;&#26029;&#65306;</li>
</ul>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> C <span class="sy1">=</span> requires <span class="br0">{</span>
new <span class="kw4">int</span><span class="br0">[</span><span class="sy2">-</span><span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span>sizeof<span class="br0">(</span>T<span class="br0">)</span><span class="br0">]</span><span class="sy4">;</span> <span class="co1">// &#23545;&#27599;&#20010; T &#38750;&#27861;&#65306;&#30149;&#24335;&#65292;&#19981;&#35201;&#27714;&#35786;&#26029;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<h4><span class="mw-headline" id=".E7.AE.80.E5.8D.95.E8.A6.81.E6.B1.82">&#31616;&#21333;&#35201;&#27714;</span></h4>
<p>&#31616;&#21333;&#35201;&#27714;&#26159;&#20219;&#24847;&#34920;&#36798;&#24335;&#35821;&#21477;&#12290;&#35201;&#27714;&#26159;&#34920;&#36798;&#24335;&#21512;&#27861;&#65288;&#26159;&#20026;<i>&#34920;&#36798;&#24335;&#21046;&#32422;</i>&#65289;&#12290;&#19981;&#21516;&#20110;&#35859;&#35789;&#21046;&#32422;&#65292;&#19981;&#21457;&#29983;&#27714;&#20540;&#65292;&#21482;&#26816;&#26597;&#35821;&#35328;&#27491;&#30830;&#24615;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> Addable <span class="sy1">=</span>
requires <span class="br0">(</span>T a, T b<span class="br0">)</span> <span class="br0">{</span>
a <span class="sy2">+</span> b<span class="sy4">;</span> <span class="co1">// &ldquo;&#34920;&#36798;&#24335; a + b &#26159;&#21487;&#32534;&#35793;&#30340;&#21512;&#27861;&#34920;&#36798;&#24335;&rdquo;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// &#26469;&#33258;&#26631;&#20934;&#24211;&#65288;&#33539;&#22260; TS &#65289;&#30340;&#31034;&#20363;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span> T, <span class="kw1">class</span> U <span class="sy1">=</span> T<span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> Swappable <span class="sy1">=</span> requires<span class="br0">(</span>T<span class="sy3">&amp;&amp;</span> t, U<span class="sy3">&amp;&amp;</span> u<span class="br0">)</span> <span class="br0">{</span>
swap<span class="br0">(</span><a href="cpp-utility-forward.html"><span class="kw1117">std::<span class="me2">forward</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">(</span>t<span class="br0">)</span>, <a href="cpp-utility-forward.html"><span class="kw1117">std::<span class="me2">forward</span></span></a><span class="sy1">&lt;</span>U<span class="sy1">&gt;</span><span class="br0">(</span>u<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
swap<span class="br0">(</span><a href="cpp-utility-forward.html"><span class="kw1117">std::<span class="me2">forward</span></span></a><span class="sy1">&lt;</span>U<span class="sy1">&gt;</span><span class="br0">(</span>u<span class="br0">)</span>, <a href="cpp-utility-forward.html"><span class="kw1117">std::<span class="me2">forward</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">(</span>t<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<h4><span class="mw-headline" id=".E7.B1.BB.E5.9E.8B.E8.A6.81.E6.B1.82">&#31867;&#22411;&#35201;&#27714;</span></h4>
<p>&#31867;&#22411;&#35201;&#27714;&#26159;&#20851;&#38190;&#35789; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">typename</span></span></span> &#21518;&#38543;&#31867;&#22411;&#21517;&#65292;&#21487;&#36873;&#22320;&#26377;&#38480;&#23450;&#12290;&#35201;&#27714;&#26159;&#35813;&#20855;&#21517;&#31867;&#22411;&#23384;&#22312;&#65288;<i>&#31867;&#22411;&#21046;&#32422;</i>&#65289;&#65306;&#36825;&#21487;&#29992;&#20110;&#26657;&#39564;&#20855;&#20307;&#30340;&#20855;&#21517;&#23884;&#22871;&#31867;&#22411;&#26159;&#21542;&#23384;&#22312;&#65292;&#25110;&#31867;&#27169;&#26495;&#29305;&#21270;&#26159;&#21542;&#25351;&#21517;&#19968;&#20010;&#31867;&#22411;&#65292;&#25110;&#21035;&#21517;&#27169;&#26495;&#26159;&#21542;&#25351;&#21517;&#19968;&#20010;&#31867;&#22411;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> <span class="kw1">using</span> Ref <span class="sy1">=</span> T<span class="sy3">&amp;</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> C <span class="sy1">=</span>
requires <span class="br0">{</span>
<span class="kw1">typename</span> T<span class="sy4">::</span><span class="me2">inner</span><span class="sy4">;</span> <span class="co1">// &#35201;&#27714;&#30340;&#23884;&#22871;&#25104;&#21592;&#21517;</span>
<span class="kw1">typename</span> S<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// &#35201;&#27714;&#30340;&#31867;&#27169;&#26495;&#29305;&#21270;</span>
<span class="kw1">typename</span> Ref<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// &#35201;&#27714;&#30340;&#21035;&#21517;&#27169;&#29256;&#26367;&#25442;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// &#26469;&#33258;&#26631;&#20934;&#24211;&#65288;&#33539;&#22260; TS &#65289;&#30340;&#31034;&#20363;&#27010;&#24565;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span> T, <span class="kw1">class</span> U<span class="sy1">&gt;</span> <span class="kw1">using</span> CommonType <span class="sy1">=</span> <a href="cpp-types-common_type.html"><span class="kw636">std::<span class="me2">common_type_t</span></span></a><span class="sy1">&lt;</span>T, U<span class="sy1">&gt;</span><span class="sy4">;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span> T, <span class="kw1">class</span> U<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> Common <span class="sy1">=</span>
requires <span class="br0">(</span>T t, U u<span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">typename</span> CommonType<span class="sy1">&lt;</span>T, U<span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// CommonType&lt;T, U&gt; &#21512;&#27861;&#19988;&#25351;&#21517;&#31867;&#22411;</span>
<span class="br0">{</span> CommonType<span class="sy1">&lt;</span>T, U<span class="sy1">&gt;</span><span class="br0">{</span><a href="cpp-utility-forward.html"><span class="kw1117">std::<span class="me2">forward</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">(</span>t<span class="br0">)</span><span class="br0">}</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="br0">{</span> CommonType<span class="sy1">&lt;</span>T, U<span class="sy1">&gt;</span><span class="br0">{</span><a href="cpp-utility-forward.html"><span class="kw1117">std::<span class="me2">forward</span></span></a><span class="sy1">&lt;</span>U<span class="sy1">&gt;</span><span class="br0">(</span>u<span class="br0">)</span><span class="br0">}</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<h4><span class="mw-headline" id=".E5.A4.8D.E5.90.88.E8.A6.81.E6.B1.82">&#22797;&#21512;&#35201;&#27714;</span></h4>
<p>&#22797;&#21512;&#35201;&#27714;&#25317;&#26377;&#24418;&#24335;</p>
<table class="t-sdsc-begin">
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td class="t-sdsc-nopad"><code><b>{</b></code> <span class="t-spar">expression</span> <code><b>}</b></code> <code><b>noexcept</b></code><span class="t-mark">(&#21487;&#36873;)</span> <span class="t-spar">trailing-return-type</span><span class="t-mark">(&#21487;&#36873;)</span> <code><b>;</b></code></td>
<td class="t-sdsc-nopad"></td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
</table>
<p>&#24182;&#25351;&#23450;&#19979;&#21015;&#21046;&#32422;&#30340;&#21512;&#21462;&#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> <span class="t-spar">expression</span> &#26159;&#21512;&#27861;&#34920;&#36798;&#24335;&#65288;<i>&#34920;&#36798;&#24335;&#21046;&#32422;</i>&#65289;</div>
<div class="t-li1"><span class="t-li">2)</span> &#33509;&#20351;&#29992; <code>noexcept</code> &#65292;&#21017;&#34920;&#36798;&#24335;&#24517;&#39035;&#20134;&#20026; noexcept &#65288;<i>&#24322;&#24120;&#21046;&#32422;</i>&#65289;</div>
<div class="t-li1"><span class="t-li">3)</span> &#33509; <span class="t-spar">trailing-return-type</span> &#25351;&#21517;&#29992;&#21344;&#20301;&#31526;&#30340;&#31867;&#22411;&#65292;&#21017;&#31867;&#22411;&#24517;&#39035;&#21487;&#20174;&#34920;&#36798;&#24335;&#30340;&#31867;&#22411;&#25512;&#23548;&#65288;<i>&#23454;&#21442;&#25512;&#23548;&#21046;&#32422;</i>&#65289;</div>
<div class="t-li1"><span class="t-li">4)</span> &#33509; <span class="t-spar">trailing-return-type</span> &#25351;&#21517;&#19981;&#29992;&#21344;&#20301;&#31526;&#30340;&#31867;&#22411;&#65292;&#21017;&#20877;&#28155;&#21152;&#20108;&#20010;&#21046;&#32422;&#65306;</div>
<div class="t-li2"><span class="t-li">4a)</span> <span class="t-spar">trailing-return-type</span> &#25152;&#25351;&#21517;&#30340;&#31867;&#22411;&#21512;&#27861;&#65288;<i>&#31867;&#22411;&#21046;&#32422;</i>&#65289;</div>
<div class="t-li2"><span class="t-li">4b)</span> &#34920;&#36798;&#24335;&#32467;&#26524;<a href="cpp-language-implicit_conversion.html">&#21487;&#38544;&#24335;&#36716;&#25442;</a>&#25104;&#35813;&#31867;&#22411;&#65288;<i>&#38544;&#24335;&#36716;&#25442;&#21046;&#32422;</i>&#65289;</div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> C2 <span class="sy1">=</span>
requires<span class="br0">(</span>T x<span class="br0">)</span> <span class="br0">{</span>
<span class="br0">{</span><span class="sy2">*</span>x<span class="br0">}</span> <span class="sy2">-</span><span class="sy1">&gt;</span> <span class="kw1">typename</span> T<span class="sy4">::</span><span class="me2">inner</span><span class="sy4">;</span> <span class="co1">// &#34920;&#36798;&#24335; *x &#24517;&#39035;&#21512;&#27861;</span>
<span class="co1">// AND &#31867;&#22411; T::inner &#24517;&#39035;&#21512;&#27861;</span>
<span class="co1">// AND *x &#30340;&#32467;&#26524;&#24517;&#39035;&#21487;&#36716;&#25442;&#25104; T::inner</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// &#26469;&#33258;&#26631;&#20934;&#24211;&#65288;&#33539;&#22260; TS &#65289;&#30340;&#31034;&#20363;&#27010;&#24565;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span> T, <span class="kw1">class</span> U<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> Same <span class="sy1">=</span> <a href="cpp-types-is_same.html"><span class="kw588">std::<span class="me2">is_same</span></span></a><span class="sy1">&lt;</span>T,U<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">value</span><span class="sy4">;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span> B<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> Boolean <span class="sy1">=</span>
requires<span class="br0">(</span>B b1, B b2<span class="br0">)</span> <span class="br0">{</span>
<span class="br0">{</span> <span class="kw4">bool</span><span class="br0">(</span>b1<span class="br0">)</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#30452;&#25509;&#21021;&#22987;&#21270;&#21046;&#32422;&#24517;&#39035;&#20351;&#29992;&#34920;&#36798;&#24335;</span>
<span class="br0">{</span> <span class="sy3">!</span>b1 <span class="br0">}</span> <span class="sy2">-</span><span class="sy1">&gt;</span> <span class="kw4">bool</span><span class="sy4">;</span> <span class="co1">// &#22797;&#21512;&#21046;&#32422;</span>
requires Same<span class="sy1">&lt;</span>decltype<span class="br0">(</span>b1 <span class="sy3">&amp;&amp;</span> b2<span class="br0">)</span>, <span class="kw4">bool</span><span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// &#23884;&#22871;&#21046;&#32422;&#65292;&#35265;&#21518;&#36848;</span>
requires Same<span class="sy1">&lt;</span>decltype<span class="br0">(</span>b1 <span class="sy3">||</span> b2<span class="br0">)</span>, <span class="kw4">bool</span><span class="sy1">&gt;</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<h4><span class="mw-headline" id=".E5.B5.8C.E5.A5.97.E8.A6.81.E6.B1.82">&#23884;&#22871;&#35201;&#27714;</span></h4>
<p>&#23884;&#22871;&#35201;&#27714;&#26159;&#21478;&#19968;&#20197;&#20998;&#21495;&#32456;&#27490;&#30340; <i>requires &#23376;&#21477;</i>&#12290;&#23427;&#34987;&#29992;&#20110;&#24341;&#20837;<i>&#35859;&#35789;&#21046;&#32422;</i>&#65288;&#35265;&#21069;&#36848;&#65289;&#65292;&#35813;&#21046;&#32422;&#20197;&#21478;&#19968;&#24212;&#29992;&#21040;&#23616;&#37096;&#21442;&#25968;&#30340;&#20855;&#21517;&#21046;&#32422;&#34920;&#36798;&#65288;&#22312; requires &#23376;&#21477;&#22806;&#65292;&#35859;&#35789;&#21046;&#32422;&#19981;&#33021;&#20351;&#29992;&#21442;&#25968;&#65292;&#32780;&#30452;&#25509;&#25918;&#32622;&#34920;&#36798;&#24335;&#20110; requires &#23376;&#21477;&#20013;&#20250;&#20196;&#23427;&#25104;&#20026;&#34920;&#36798;&#24335;&#21046;&#32422;&#65292;&#36825;&#34920;&#31034;&#19981;&#27714;&#20540;&#23427;&#65289;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co1">// &#26469;&#33258;&#33539;&#22260; TS &#30340;&#31034;&#20363;&#21046;&#32422;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> Semiregular <span class="sy1">=</span> DefaultConstructible<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="sy3">&amp;&amp;</span>
CopyConstructible<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="sy3">&amp;&amp;</span> Destructible<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="sy3">&amp;&amp;</span> CopyAssignable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="sy3">&amp;&amp;</span>
requires<span class="br0">(</span>T a, size_t n<span class="br0">)</span> <span class="br0">{</span>
requires Same<span class="sy1">&lt;</span>T<span class="sy2">*</span>, decltype<span class="br0">(</span><span class="sy3">&amp;</span>a<span class="br0">)</span><span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// &#23884;&#22871;&#65306;&ldquo; Same&lt;...&gt; &#27714;&#20540;&#20026; true &rdquo;</span>
<span class="br0">{</span> a.~T<span class="br0">(</span><span class="br0">)</span> <span class="br0">}</span> <span class="kw1">noexcept</span><span class="sy4">;</span> <span class="co1">// &#22797;&#21512;&#65306; &quot;a.~T()&quot; &#26159;&#19981;&#25243;&#20986;&#30340;&#21512;&#27861;&#34920;&#36798;&#24335;</span>
requires Same<span class="sy1">&lt;</span>T<span class="sy2">*</span>, decltype<span class="br0">(</span>new T<span class="br0">)</span><span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// &#23884;&#22871;&#65306;&ldquo; Same&lt;...&gt; &#27714;&#20540;&#20026; true &rdquo;</span>
requires Same<span class="sy1">&lt;</span>T<span class="sy2">*</span>, decltype<span class="br0">(</span>new T<span class="br0">[</span>n<span class="br0">]</span><span class="br0">)</span><span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// &#23884;&#22871;</span>
<span class="br0">{</span> delete new T <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#22797;&#21512;</span>
<span class="br0">{</span> delete new T<span class="br0">[</span>n<span class="br0">]</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#22797;&#21512;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<h3><span class="mw-headline" id=".E6.A6.82.E5.BF.B5.E5.86.B3.E8.AE.AE">&#27010;&#24565;&#20915;&#35758;</span></h3>
<p>&#31867;&#20284;&#20219;&#20309;&#20854;&#20182;&#20989;&#25968;&#27169;&#26495;&#65292;&#20989;&#25968;&#27010;&#24565;&#65288;&#20294;&#19981;&#26159;&#21464;&#37327;&#27010;&#24565;&#65289;&#33021;&#37325;&#36733;&#65306;&#21487;&#20197;&#25552;&#20379;&#20840;&#37096;&#20351;&#29992;&#21516;&#19968; <span class="t-spar">concept-name</span> &#30340;&#22810;&#20010;&#27010;&#24565;&#23450;&#20041;&#12290;</p>
<p>&#27010;&#24565;&#20915;&#35758;&#22312; <span class="t-spar">concept-name</span> &#65288;&#21487;&#20197;&#26377;&#38480;&#23450;&#65289;&#20986;&#29616;&#20110;&#19979;&#21015;&#35821;&#22659;&#26102;&#36827;&#34892;</p>
<div class="t-li1"><span class="t-li">1)</span> &#26377;&#21046;&#32422;&#31867;&#22411;&#25351;&#23450;&#31526; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span> f<span class="br0">(</span>Concept<span class="br0">)</span><span class="sy4">;</span> <a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1">&lt;</span>Concept<span class="sy1">&gt;</span> x <span class="sy1">=</span> ...<span class="sy4">;</span></span></span></div>
<div class="t-li1"><span class="t-li">2)</span> &#26377;&#21046;&#32422;&#24418;&#21442; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1">&lt;</span>Concept T<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span></span></span></div>
<div class="t-li1"><span class="t-li">3)</span> &#27169;&#26495;&#24341;&#20837; <span class="t-c"><span class="mw-geshi cpp source-cpp">Concept<span class="br0">{</span>T<span class="br0">}</span> <span class="kw1">struct</span> X<span class="sy4">;</span></span></span></div>
<div class="t-li1"><span class="t-li">4)</span> <i>&#21046;&#32422;&#34920;&#36798;&#24335;</i> <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span> requires Concept<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">;</span></span></span></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> C<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// #1</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T, <span class="kw1">typename</span> U<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> C<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// #2</span>
<span class="kw4">void</span> f<span class="br0">(</span>C<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// C &#25152;&#25351;&#20195;&#30340;&#21046;&#32422;&#38598;&#21253;&#21547; #1 &#21644; #2 &#65307;</span>
<span class="co1">// &#27010;&#24565;&#20915;&#35758;&#65288;&#35265;&#21518;&#36848;&#65289;&#36873;&#25321; #1 &#12290;</span></pre></div>
</div>
<p>&#20026;&#36827;&#34892;&#27010;&#24565;&#20915;&#35758;&#65292;&#27599;&#20010;&#21305;&#37197;&#21517;&#31216;&#65288;&#19982;&#38480;&#23450;&#65292;&#33509;&#23384;&#22312;&#65289;&#30340;<i>&#27169;&#26495;&#24418;&#21442;</i>&#37117;&#19982;&#27169;&#26495;&#23454;&#21442;&#19982;<i>&#36890;&#37197;&#31526;</i>&#36825;&#20123;<i>&#27010;&#24565;&#23454;&#21442;</i>&#30340;&#24207;&#21015;&#37197;&#23545;&#12290;&#36890;&#37197;&#31526;&#21487;&#21305;&#37197;&#20219;&#20309;&#31181;&#31867;&#65288;&#31867;&#22411;&#12289;&#38750;&#31867;&#22411;&#12289;&#27169;&#26495;&#65289;&#30340;&#27169;&#26495;&#23454;&#21442;&#12290;&#24418;&#21442;&#38598;&#26500;&#36896;&#26041;&#24335;&#21508;&#24322;&#65292;&#20381;&#36182;&#20110;&#35821;&#22659;</p>
<div class="t-li1"><span class="t-li">1)</span> &#23545;&#20110;&#29992;&#20316;&#26377;&#21046;&#32422;&#31867;&#22411;&#25351;&#23450;&#31526;&#25110;&#24418;&#21442;&#19968;&#37096;&#20998;&#30340;&#27010;&#24565;&#21517;&#65292;&#33509;&#27010;&#24565;&#21517;&#20197;&#26080;&#24418;&#21442;&#21015;&#34920;&#20351;&#29992;&#65292;&#21017;&#23454;&#21442;&#21015;&#34920;&#26159;&#21333;&#20010;&#36890;&#37197;&#31526;&#12290;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> C1<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// #1</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T, <span class="kw1">typename</span> U<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> C1<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// #2</span>
<span class="kw4">void</span> f1<span class="br0">(</span><span class="kw4">const</span> C1<span class="sy2">*</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &lt;wildcard&gt; &#21305;&#37197; &lt;T&gt; &#65292;&#36873;&#25321; #1</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">2)</span> &#23545;&#20110;&#29992;&#20316;&#26377;&#21046;&#32422;&#31867;&#22411;&#25351;&#23450;&#31526;&#25110;&#24418;&#21442;&#19968;&#37096;&#20998;&#30340;&#27010;&#24565;&#21517;&#65292;&#33509;&#27010;&#24565;&#21517;&#20197;&#27169;&#26495;&#23454;&#21442;&#21015;&#34920;&#20351;&#29992;&#65292;&#21017;&#23454;&#21442;&#21015;&#34920;&#26159;&#19968;&#20010;&#36890;&#37197;&#31526;&#21518;&#38543;&#23454;&#21442;&#21015;&#34920;&#12290;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> C1<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// #1</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T, <span class="kw1">typename</span> U<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> C1<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// #2</span>
<span class="kw4">void</span> f2<span class="br0">(</span>C1<span class="sy1">&lt;</span><span class="kw4">char</span><span class="sy1">&gt;</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &lt;wildcard, char&gt; &#21305;&#37197; &lt;T, U&gt; &#65292;&#36873;&#25321; #2</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">3)</span> &#33509;&#27010;&#24565;&#20986;&#29616;&#20110;&#27169;&#26495;&#24341;&#20837;&#20013;&#65292;&#21017;&#23454;&#21442;&#21015;&#34920;&#26159;&#19982;&#27169;&#26495;&#24341;&#20837;&#20013;&#24418;&#21442;&#21015;&#34920;&#31561;&#38271;&#30340;&#21344;&#20301;&#31526;&#24207;&#21015;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span>... <span class="me1">Ts</span><span class="sy1">&gt;</span>
concept <span class="kw4">bool</span> C3 <span class="sy1">=</span> <span class="kw2">true</span><span class="sy4">;</span>
C3<span class="br0">{</span>T<span class="br0">}</span> <span class="kw4">void</span> q2<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK: &lt;T&gt; &#21305;&#37197; &lt;...Ts&gt;</span>
C3<span class="br0">{</span>...<span class="me1">Ts</span><span class="br0">}</span> <span class="kw4">void</span> q1<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK: &lt;...Ts&gt; &#21305;&#37197; &lt;...Ts&gt;</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">4)</span> &#33509;&#27010;&#24565;&#20316;&#20026;&#27169;&#26495; id &#20986;&#29616;&#65292;&#21017;&#27010;&#24565;&#23454;&#21442;&#21015;&#34920;&#20934;&#30830;&#22320;&#26159;&#35813;&#27169;&#26495; id &#30340;&#23454;&#21442;&#24207;&#21015;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> C<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// #1</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T, <span class="kw1">typename</span> U<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> C<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// #2</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
<span class="kw4">void</span> f<span class="br0">(</span>T<span class="br0">)</span> requires C<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#21305;&#37197; #1</span></pre></div>
</div>
</div>
<p>&#27010;&#24565;&#20915;&#35758;&#36890;&#36807;&#37197;&#23545;&#27599;&#20010;&#23454;&#21442;&#21644;&#23545;&#24212;&#27599;&#20010;&#21487;&#35265;&#27010;&#24565;&#30340;&#23545;&#24212;&#24418;&#21442;&#36827;&#34892;&#12290;&#40664;&#35748;&#27169;&#26495;&#23454;&#21442;&#65288;&#33509;&#20351;&#29992;&#65289;&#20026;&#27599;&#20010;&#19981;&#23545;&#24212;&#23454;&#21442;&#30340;&#24418;&#21442;&#23454;&#20363;&#21270;&#65292;&#28982;&#21518;&#21518;&#38468;&#21040;&#23454;&#21442;&#21015;&#34920;&#12290;&#27169;&#26495;&#23454;&#21442;&#21305;&#37197;&#24418;&#21442;&#65292;&#20165;&#33509;&#23427;&#25317;&#26377;&#30456;&#21516;&#31181;&#31867;&#65288;&#31867;&#22411;&#12289;&#38750;&#31867;&#22411;&#12289;&#27169;&#26495;&#65289;&#65292;&#38500;&#38750;&#23454;&#21442;&#26159;&#36890;&#37197;&#31526;&#12290;&#24418;&#21442;&#21253;&#21487;&#21305;&#37197;&#38646;&#25110;&#26356;&#22810;&#23454;&#21442;&#65292;&#21482;&#35201;&#25152;&#26377;&#23454;&#21442;&#37117;&#21305;&#37197;&#31181;&#31867;&#20013;&#30340;&#27169;&#24335;&#65288;&#38500;&#38750;&#23427;&#20204;&#26159;&#36890;&#37197;&#31526;&#65289;&#12290;</p>
<p>&#33509;&#20219;&#20309;&#23454;&#21442;&#19981;&#21305;&#37197;&#20854;&#23545;&#24212;&#30340;&#24418;&#21442;&#65292;&#25110;&#33509;&#26377;&#22810;&#20110;&#24418;&#21442;&#30340;&#23454;&#21442;&#65292;&#19988;&#26368;&#21518;&#30340;&#24418;&#21442;&#19981;&#26159;&#21253;&#65292;&#21017;&#35813;&#27010;&#24565;&#19981;&#21487;&#36798;&#12290;&#33509;&#26377;&#38646;&#25110;&#22810;&#20110;&#19968;&#20010;&#21487;&#29983;&#25104;&#27010;&#24565;&#65292;&#21017;&#31243;&#24207;&#20026;&#30149;&#24335;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> C2<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="br0">}</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span> T<span class="sy1">&gt;</span> concept <span class="kw4">bool</span> C2<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="br0">}</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>C2<span class="sy1">&lt;</span><span class="nu0">0</span><span class="sy1">&gt;</span> T<span class="sy1">&gt;</span> <span class="kw1">struct</span> S1<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306; &lt;wildcard, 0&gt; &#19981;&#21305;&#37197; &lt;typename T&gt; &#25110; &lt;int T&gt;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>C2 T<span class="sy1">&gt;</span> <span class="kw1">struct</span> S2<span class="sy4">;</span> <span class="co1">// #1 &#19982; #2 &#22343;&#21305;&#37197;&#65306;&#38169;&#35823;</span></pre></div>
</div>
<table class="metadata plainlinks ambox mbox-small-left ambox-notice" style="">
<tr>
<td class="mbox-empty-cell"></td>
<td class="mbox-text" style="">&#26412;&#33410;&#26410;&#23436;&#25104;<br />
&#21407;&#22240;&#65306;&#38656;&#35201;&#19968;&#20010;&#24102;&#26377;&#24847;&#20041;&#27010;&#24565;&#30340;&#31034;&#20363;&#65292;&#32780;&#38750;&#36825;&#20123; &#39;return true&#39; &#21344;&#20301;&#31526;</td>
</tr>
</table>
<h3><span class="mw-headline" id=".E5.88.B6.E7.BA.A6.E7.9A.84.E5.81.8F.E5.BA.8F">&#21046;&#32422;&#30340;&#20559;&#24207;</span></h3>
<p>&#22312;&#20219;&#20309;&#36827;&#19968;&#27493;&#20998;&#26512;&#21069;&#65292;&#36890;&#36807;&#26367;&#25442;&#27599;&#20010;&#20855;&#21517;&#27010;&#24565;&#21644;&#27599;&#20010; requires &#34920;&#36798;&#24335;&#30340;&#20307;<i>&#35268;&#33539;&#21270;</i>&#21046;&#32422;&#65292;&#30452;&#21040;&#21097;&#19979;&#21407;&#23376;&#21046;&#32422;&#19978;&#30340;&#21512;&#21462;&#19982;&#26512;&#21462;&#24207;&#21015;&#12290;&#21407;&#23376;&#21046;&#32422;&#26159;&#35859;&#35789;&#21046;&#32422;&#12289;&#34920;&#36798;&#24335;&#21046;&#32422;&#12289;&#38544;&#24335;&#36716;&#25442;&#21046;&#32422;&#12289;&#23454;&#21442;&#25512;&#23548;&#21046;&#32422;&#21644;&#24322;&#24120;&#21046;&#32422;&#12290;</p>
<p>&#33509;&#33021;&#19981;&#22240;&#31561;&#20215;&#24615;&#20998;&#26512;&#31867;&#22411;&#21644;&#34920;&#36798;&#24335;&#23601;&#33021;&#35777;&#26126;&#27010;&#24565; <code>P</code> <a href="https://en.wikipedia.org/wiki/Logical_consequence" class="extiw" title="enwiki:Logical consequence">&#34164;&#21547;</a> &#27010;&#24565; <code>Q</code> &#65292;&#21017;&#35828; <code>P</code> <i>&#21253;&#21547;</i> <code>Q</code> &#65288;&#25925; <code>N &gt;= 0</code> &#19981;&#21253;&#21547; <code>N &gt; 0</code> &#65289;</p>
<p>&#20855;&#20307;&#32780;&#35328;&#65292;&#36716;&#25442;&#39318;&#20010; <code>P</code> &#20026;&#26512;&#21462;&#33539;&#24335;&#24182;&#36716;&#25442; <code>Q</code> &#20026;&#21512;&#21462;&#33539;&#24335;&#65292;&#20877;&#20197;&#19979;&#21015;&#26041;&#24335;&#27604;&#36739;&#23427;&#20204;&#65306;</p>
<ul>
<li>&#27599;&#20010;&#21407;&#23376;&#21046;&#32422; <code>A</code> &#21253;&#21547;&#31561;&#20215;&#30340;&#21407;&#23376;&#21046;&#32422; <code>A</code></li>
<li>&#27599;&#20010;&#21407;&#23376;&#21046;&#32422; <code>A</code> &#21253;&#21547;&#26512;&#21462; <code>A||B</code> &#32780;&#19981;&#21253;&#21547;&#21512;&#21462; <code>A&amp;&amp;B</code></li>
<li>&#27599;&#20010;&#21512;&#21462; <code>A&amp;&amp;B</code> &#21253;&#21547; <code>A</code> &#65292;&#20294;&#26512;&#21462; <code>A||B</code> &#19981;&#21253;&#21547; <code>A</code></li>
</ul>
<p>&#21253;&#21547;&#20851;&#31995;&#23450;&#20041;&#21046;&#32422;&#19978;&#30340;&#20559;&#24207;&#65292;&#36825;&#34987;&#29992;&#20110;&#30830;&#23450;&#65306;</p>
<ul>
<li><a href="cpp-language-overload_resolution.html">&#37325;&#36733;&#20915;&#35758;</a>&#20013;&#38750;&#27169;&#26495;&#20989;&#25968;&#30340;&#26368;&#20339;&#21487;&#29983;&#25104;&#20505;&#36873;</li>
<li>&#37325;&#36733;&#38598;&#20013;<a href="cpp-language-overloaded_address.html">&#38750;&#27169;&#26495;&#20989;&#25968;&#30340;&#22320;&#22336;</a></li>
<li>&#27169;&#26495;&#27169;&#26495;&#23454;&#21442;&#30340;&#26368;&#20339;&#21305;&#37197;</li>
<li>&#31867;&#27169;&#26495;&#29305;&#21270;&#30340;&#20559;&#24207;</li>
<li>&#20989;&#25968;&#27169;&#26495;&#30340;<a href="cpp-language-function_template.html#.E5.87.BD.E6.95.B0.E6.A8.A1.E6.9D.BF.E9.87.8D.E8.BD.BD">&#20559;&#24207;</a></li>
</ul>
<table class="metadata plainlinks ambox mbox-small-left ambox-notice" style="">
<tr>
<td class="mbox-empty-cell"></td>
<td class="mbox-text" style="">&#26412;&#33410;&#26410;&#23436;&#25104;<br />
&#21407;&#22240;&#65306;&#20174;&#19978;&#36848;&#20869;&#23481;&#28155;&#21152;&#21040;&#27492;&#30340;&#22238;&#38142;</td>
</tr>
</table>
<p>&#33509;&#22768;&#26126; <code>D1</code> &#19982; <code>D2</code> &#26377;&#21046;&#32422;&#19988; D1 &#30340;&#35268;&#33539;&#21270;&#21046;&#32422;&#21253;&#21547; D2 &#30340;&#35268;&#33539;&#21270;&#21046;&#32422;&#65288;&#25110;&#33509; D1 &#26377;&#21046;&#32422;&#32780; D2 &#26080;&#21046;&#32422;&#65289;&#65292;&#21017;&#35828; D1 &#19982; D2 &#30456;&#27604;<i>&#33267;&#23569;&#19968;&#26679;&#26377;&#21046;&#32422;</i>&#12290;&#33509; D1 &#33267;&#23569;&#19982; D2 &#19968;&#26679;&#26377;&#21046;&#32422;&#65292;&#32780; D2 &#19981;&#33267;&#23569;&#19982; D1 &#19968;&#26679;&#26377;&#21046;&#32422;&#65292;&#21017; D1 &#27604; D2 <i>&#26356;&#21463;&#21046;&#32422;</i>&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
concept Decrementable <span class="sy1">=</span> requires<span class="br0">(</span>T t<span class="br0">)</span> <span class="br0">{</span> <span class="sy2">--</span>t<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
concept RevIterator <span class="sy1">=</span> Decrementable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="sy3">&amp;&amp;</span> requires<span class="br0">(</span>T t<span class="br0">)</span> <span class="br0">{</span> <span class="sy2">*</span>t<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// RevIterator &#21253;&#21547; Decrementable &#65292;&#20294;&#38750;&#30456;&#21453;</span>
<span class="co1">// RevIterator &#27604; Decrementable &#26356;&#21463;&#21046;&#32422;</span>
<span class="kw4">void</span> f<span class="br0">(</span>Decrementable<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #1</span>
<span class="kw4">void</span> f<span class="br0">(</span>RevIterator<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #2</span>
f<span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// int &#20165;&#28385;&#36275;&#21487;&#33258;&#22686;&#65292;&#36873;&#25321; #1</span>
f<span class="br0">(</span><span class="br0">(</span><span class="kw4">int</span><span class="sy2">*</span><span class="br0">)</span><span class="nu0">0</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// int* &#28385;&#36275;&#20108;&#20010;&#21046;&#32422;&#65292;&#36873;&#25321; #2 &#65292;&#22240;&#20026;&#26356;&#21463;&#21046;&#32422;</span>
<span class="kw4">void</span> g<span class="br0">(</span><span class="kw4">auto</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #3&#65288;&#26080;&#21046;&#32422;&#65289;</span>
<span class="kw4">void</span> g<span class="br0">(</span>Decrementable<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #4</span>
g<span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// bool &#19981;&#28385;&#36275; Decrementable &#65292;&#36873;&#25321; #3</span>
g<span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// int &#28385;&#36275; Decrementable &#65292;&#36873;&#25321; #4 &#22240;&#20026;&#23427;&#26356;&#21463;&#21046;&#32422;</span></pre></div>
</div>
<h3><span class="mw-headline" id=".E5.85.B3.E9.94.AE.E8.AF.8D">&#20851;&#38190;&#35789;</span></h3>
<p><a href="cpp-keyword-concept.html"><tt>concept</tt></a>, <a href="cpp-keyword-requires.html"><tt>requires</tt></a></p>
<h3><span class="mw-headline" id=".E7.BC.96.E8.AF.91.E5.99.A8.E6.94.AF.E6.8C.81">&#32534;&#35793;&#22120;&#25903;&#25345;</span></h3>
<p>GCC &gt;= 6.1 &#25903;&#25345;&#27492;&#25216;&#26415;&#35268;&#33539;&#65288;&#35201;&#27714;&#36873;&#39033; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">-</span>fconcepts</span></span> &#65289;&#12290;</p>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>