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

595 lines
81 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>&#32422;&#26463;&#19982;&#27010;&#24565; (C++20 &#36215;)</title>
<link rel="stylesheet" href="ext.css" />
<link rel="stylesheet" href="site_modules.css" />
</head>
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_language_constraints skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading">&#32422;&#26463;&#19982;&#27010;&#24565; <span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></h1>
<div id="bodyContent">
<div id="contentSub"><span class="subpages">&lt; <a href="cpp.html">cpp</a>&lrm; | <a href="cpp-language.html">language</a></span></div>
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
<dl>
<dd><i>&#26412;&#39029;&#38754;&#25551;&#36848;&#20102; C++20 &#25509;&#32435;&#30340;&#26680;&#24515;&#35821;&#35328;&#29305;&#24615;&#12290;&#23545;&#20110;&#26631;&#20934;&#24211;&#20013;&#20351;&#29992;&#30340;&#20855;&#21517;&#31867;&#22411;&#35201;&#27714;&#65292;&#35265;<a href="cpp-named_req.html">&#20855;&#21517;&#35201;&#27714;</a>&#12290;&#26377;&#20851;&#36825;&#20010;&#21151;&#33021;&#29305;&#24615;&#30340;&#27010;&#24565; TS &#29256;&#26412;&#65292;&#35265;<a href="cpp-experimental-constraints.html">&#27492;&#22788;</a>&#12290;</i></dd>
</dl>
<p><a href="cpp-language-class_template.html">&#31867;&#27169;&#26495;</a>&#65292;<a href="cpp-language-function_template.html">&#20989;&#25968;&#27169;&#26495;</a>&#65292;&#20197;&#21450;&#38750;&#27169;&#26495;&#20989;&#25968;&#65288;&#36890;&#24120;&#26159;&#31867;&#27169;&#26495;&#30340;&#25104;&#21592;&#65289;&#65292;&#21487;&#20197;&#20851;&#32852;&#21040;<i>&#32422;&#26463;&#65288;constraint&#65289;</i>&#65292;&#23427;&#25351;&#23450;&#20102;&#23545;&#27169;&#26495;&#23454;&#21442;&#30340;&#19968;&#20123;&#35201;&#27714;&#65292;&#36825;&#20123;&#35201;&#27714;&#21487;&#20197;&#34987;&#29992;&#20110;&#36873;&#25321;&#26368;&#24688;&#24403;&#30340;&#20989;&#25968;&#37325;&#36733;&#21644;&#27169;&#26495;&#29305;&#21270;&#12290;</p>
<p>&#36825;&#31181;&#35201;&#27714;&#30340;&#20855;&#21517;&#38598;&#21512;&#34987;&#31216;&#20026;<i>&#27010;&#24565;&#65288;concept&#65289;</i>&#12290;&#27599;&#20010;&#27010;&#24565;&#37117;&#26159;&#35859;&#35789;&#65292;&#22312;&#32534;&#35793;&#26102;&#27714;&#20540;&#65292;&#24182;&#22312;&#33258;&#24049;&#34987;&#29992;&#20316;&#32422;&#26463;&#26102;&#25104;&#20026;&#27169;&#26495;&#25509;&#21475;&#30340;&#19968;&#37096;&#20998;&#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;cstddef&gt;</span>
<span class="co2">#include &lt;concepts&gt;</span>
<span class="co1">// &#27010;&#24565; &quot;Hashable&quot; &#30340;&#22768;&#26126;&#21487;&#20197;&#34987;&#31526;&#21512;&#20197;&#19979;&#26465;&#20214;&#30340;&#20219;&#24847;&#31867;&#22411; T &#28385;&#36275;&#65306;</span>
<span class="co1">// &#23545;&#20110; T &#31867;&#22411;&#30340;&#20540; a&#65292;&#34920;&#36798;&#24335; std::hash&lt;T&gt;{}(a) &#21487;&#20197;&#32534;&#35793;&#24182;&#19988;&#23427;&#30340;&#32467;&#26524;&#21487;&#20197;&#36716;&#25442;&#21040; std::size_t</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
concept Hashable <span class="sy1">=</span> requires<span class="br0">(</span>T a<span class="br0">)</span>
<span class="br0">{</span>
<span class="br0">{</span> <a href="cpp-utility-hash.html"><span class="kw1124">std::<span class="me2">hash</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">{</span><span class="br0">}</span><span class="br0">(</span>a<span class="br0">)</span> <span class="br0">}</span> <span class="sy2">-</span><span class="sy1">&gt;</span> std<span class="sy4">::</span><span class="me2">convertible_to</span><span class="sy1">&lt;</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a><span class="sy1">&gt;</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> meow <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>Hashable 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">// &#21463;&#32422;&#26463;&#30340; C++20 &#20989;&#25968;&#27169;&#26495;</span>
<span class="co1">// &#24212;&#29992;&#30456;&#21516;&#32422;&#26463;&#30340;&#21478;&#19968;&#31181;&#26041;&#24335;&#65306;</span>
<span class="co1">// template&lt;typename T&gt;</span>
<span class="co1">// requires Hashable&lt;T&gt;</span>
<span class="co1">// void f(T); </span>
<span class="co1">// </span>
<span class="co1">// template&lt;typename T&gt;</span>
<span class="co1">// void f(T) requires Hashable&lt;T&gt;; </span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="kw1">using</span> std<span class="sy4">::</span><span class="me2">operator</span><span class="st0">&quot;&quot;</span>s<span class="sy4">;</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&#65292;std::string &#28385;&#36275; Hashable</span>
f<span class="br0">(</span>meow<span class="br0">{</span><span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;meow &#19981;&#28385;&#36275; Hashable</span>
<span class="br0">}</span></pre></div>
</div>
</div>
<p>&#22312;&#32534;&#35793;&#26102;&#65288;&#27169;&#26495;&#23454;&#20363;&#21270;&#36807;&#31243;&#30340;&#26089;&#26399;&#65289;&#23601;&#26816;&#27979;&#26159;&#21542;&#36829;&#32972;&#32422;&#26463;&#65292;&#36825;&#26679;&#38169;&#35823;&#20449;&#24687;&#23601;&#26356;&#23481;&#26131;&#29702;&#35299;&#65306;</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">// &#27809;&#26377;&#27010;&#24565;&#26102;&#20856;&#22411;&#32534;&#35793;&#22120;&#30340;&#35786;&#26029;&#65306;</span>
<span class="co1">// &#20108;&#20803;&#34920;&#36798;&#24335;&#30340;&#25805;&#20316;&#25968;&#38750;&#27861; (&#39;std::_List_iterator&lt;int&gt;&#39; &#21644; &#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;&#26102;&#20856;&#22411;&#32534;&#35793;&#22120;&#30340;&#35786;&#26029;&#65306;</span>
<span class="co1">// &#38169;&#35823;&#65306;&#26080;&#27861;&#20197; std::_List_iterator&lt;int&gt; &#35843;&#29992; std::sort</span>
<span class="co1">// &#27880;&#24847;&#65306;&#26410;&#28385;&#36275;&#27010;&#24565; RandomAccessIterator&lt;std::_List_iterator&lt;int&gt;&gt;</span></pre></div>
</div>
<p>&#27010;&#24565;&#30340;&#30446;&#30340;&#26159;&#22609;&#36896;&#35821;&#20041;&#20998;&#31867;&#65288;Number&#12289;Range&#12289;RegularFunction&#65289;&#32780;&#38750;&#35821;&#27861;&#19978;&#30340;&#38480;&#21046;&#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> &#25152;&#35828;&#65292;&ldquo;&#19982;&#35821;&#27861;&#38480;&#21046;&#30456;&#21453;&#65292;&#30495;&#27491;&#30340;&#27010;&#24565;&#30340;&#19968;&#20010;&#20915;&#23450;&#24615;&#30340;&#29305;&#24449;&#26159;&#26377;&#33021;&#21147;&#25351;&#23450;&#26377;&#24847;&#20041;&#30340;&#35821;&#20041;&#12290;&rdquo;</p>
<h3><span class="mw-headline" id=".E6.A6.82.E5.BF.B5">&#27010;&#24565;</span></h3>
<p>&#27010;&#24565;&#26159;&#35201;&#27714;&#30340;&#20855;&#21517;&#38598;&#21512;&#12290;&#27010;&#24565;&#30340;&#23450;&#20041;&#24517;&#39035;&#22312;&#21629;&#21517;&#31354;&#38388;&#20316;&#29992;&#22495;&#20013;&#20986;&#29616;&#12290;</p>
<p>&#27010;&#24565;&#23450;&#20041;&#25317;&#26377;&#20197;&#19979;&#24418;&#24335;&#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>template</b></code> <code><b>&lt;</b></code> <span class="t-spar">&#27169;&#26495;&#24418;&#21442;&#21015;&#34920;</span> <code><b>&gt;</b></code>
<p><code><b>concept</b></code> <span class="t-spar">&#27010;&#24565;&#21517;</span> <code><b>=</b></code> <span class="t-spar">&#32422;&#26463;&#34920;&#36798;&#24335;</span><code><b>;</b></code></p>
</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>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co1">// &#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 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></pre></div>
</div>
<p>&#27010;&#24565;&#19981;&#33021;&#36882;&#24402;&#22320;&#25552;&#21450;&#33258;&#36523;&#65292;&#32780;&#19988;&#19981;&#33021;&#21463;&#32422;&#26463;&#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 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;&#65306;&#36882;&#24402;&#30340;&#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 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 Error1 <span class="sy1">=</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;C1 T &#35797;&#22270;&#32422;&#26463;&#27010;&#24565;&#23450;&#20041;</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 Error2 <span class="sy1">=</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;requires &#23376;&#21477;&#35797;&#22270;&#32422;&#26463;&#27010;&#24565;</span></pre></div>
</div>
<p>&#27010;&#24565;&#19981;&#33021;&#34987;&#26174;&#24335;&#23454;&#20363;&#21270;&#12289;&#26174;&#24335;&#29305;&#21270;&#25110;&#37096;&#20998;&#29305;&#21270;&#65288;&#19981;&#33021;&#26356;&#25913;&#32422;&#26463;&#30340;&#21407;&#21021;&#23450;&#20041;&#30340;&#21547;&#20041;&#65289;&#12290;</p>
<p>&#27010;&#24565;&#21487;&#20197;&#22312;&#26631;&#35782;&#34920;&#36798;&#24335;&#20013;&#21629;&#21517;&#12290;&#35813;&#26631;&#35782;&#34920;&#36798;&#24335;&#30340;&#20540;&#22312;&#28385;&#36275;&#32422;&#26463;&#34920;&#36798;&#24335;&#26102;&#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span>&#65292;&#21542;&#21017;&#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span>&#12290;</p>
<p>&#27010;&#24565;&#22312;&#20316;&#20026;&#20197;&#19979;&#20869;&#23481;&#30340;&#19968;&#37096;&#20998;&#26102;&#20063;&#21487;&#20197;&#22312;&#31867;&#22411;&#32422;&#26463;&#20013;&#34987;&#21629;&#21517;&#65306;</p>
<ul>
<li><a href="cpp-language-template_parameters.html#.E7.B1.BB.E5.9E.8B.E6.A8.A1.E6.9D.BF.E5.BD.A2.E5.8F.82">&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#22768;&#26126;</a></li>
<li><a href="cpp-language-auto.html">&#21344;&#20301;&#31867;&#22411;&#35828;&#26126;&#31526;</a></li>
<li><a href="cpp-language-constraints.html#.E5.A4.8D.E5.90.88.E8.A6.81.E6.B1.82">&#22797;&#21512;&#35201;&#27714;</a></li>
</ul>
<p>&#27010;&#24565;&#22312; <span class="t-spar">&#31867;&#22411;&#32422;&#26463;</span> &#20013;&#25509;&#21463;&#30340;&#23454;&#21442;&#35201;&#27604;&#23427;&#30340;&#24418;&#21442;&#21015;&#34920;&#35201;&#27714;&#30340;&#35201;&#23569;&#19968;&#20010;&#65292;&#22240;&#20026;&#25353;&#35821;&#22659;&#25512;&#23548;&#20986;&#30340;&#31867;&#22411;&#20250;&#38544;&#24335;&#22320;&#29992;&#20316;&#31532;&#19968;&#20010;&#23454;&#21442;&#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">class</span> T, <span class="kw1">class</span> U<span class="sy1">&gt;</span>
concept 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="kw1">template</span><span class="sy1">&lt;</span>Derived<span class="sy1">&lt;</span>Base<span class="sy1">&gt;</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">// T &#34987; Derived&lt;T, Base&gt; &#32422;&#26463;</span></pre></div>
</div>
<h3><span class="mw-headline" id=".E7.BA.A6.E6.9D.9F">&#32422;&#26463;</span></h3>
<p>&#32422;&#26463;&#26159;&#36923;&#36753;&#25805;&#20316;&#21644;&#25805;&#20316;&#25968;&#30340;&#24207;&#21015;&#65292;&#23427;&#20102;&#25351;&#23450;&#23545;&#27169;&#26495;&#23454;&#21442;&#30340;&#35201;&#27714;&#12290;&#23427;&#20204;&#21487;&#20197;&#22312; <i>requires &#34920;&#36798;&#24335;</i>&#65288;&#35265;&#19979;&#25991;&#65289;&#20013;&#20986;&#29616;&#65292;&#20063;&#21487;&#20197;&#30452;&#25509;&#20316;&#20026;&#27010;&#24565;&#30340;&#20027;&#20307;&#12290;</p>
<p>&#26377;&#19977;&#31181;&#31867;&#22411;&#30340;&#32422;&#26463;&#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> &#21512;&#21462;&#65288;conjunction&#65289;</div>
<div class="t-li1"><span class="t-li">2)</span> &#26512;&#21462;&#65288;disjunction&#65289;</div>
<div class="t-li1"><span class="t-li">3)</span> &#19981;&#21487;&#20998;&#21106;&#32422;&#26463;&#65288;atomic constraint&#65289;</div>
<p>&#23545;&#21253;&#21547;&#36981;&#24490;&#20197;&#19979;&#39034;&#24207;&#30340;&#25805;&#20316;&#25968;&#30340;&#36923;&#36753;&#19982;&#34920;&#36798;&#24335;&#36827;&#34892;<a href="cpp-language-constraints.html#.E7.BA.A6.E6.9D.9F.E8.A7.84.E8.8C.83.E5.8C.96">&#35268;&#33539;&#21270;</a>&#65292;&#30830;&#23450;&#19982;&#19968;&#20010;&#22768;&#26126;&#20851;&#32852;&#30340;&#32422;&#26463;&#65306;</p>
<ul>
<li>&#27599;&#20010;&#22768;&#26126;&#20013;&#21463;&#32422;&#26463;&#30340;<a href="cpp-language-template_parameters.html#.E7.B1.BB.E5.9E.8B.E6.A8.A1.E6.9D.BF.E5.BD.A2.E5.8F.82">&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;</a>&#25110;&#24102;<a href="cpp-language-auto.html">&#21344;&#20301;&#31867;&#22411;</a>&#22768;&#26126;&#30340;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#25152;&#24341;&#20837;&#30340;&#32422;&#26463;&#34920;&#36798;&#24335;&#65292;&#25353;&#20986;&#29616;&#39034;&#24207;&#65307;</li>
<li>&#27169;&#26495;&#24418;&#21442;&#21015;&#34920;&#20043;&#21518;&#30340; <i>requires</i> &#23376;&#21477;&#20013;&#30340;&#32422;&#26463;&#34920;&#36798;&#24335;&#65307;</li>
<li><a href="cpp-language-function_template.html#.E7.AE.80.E5.86.99.E5.87.BD.E6.95.B0.E6.A8.A1.E6.9D.BF">&#31616;&#20889;&#20989;&#25968;&#27169;&#26495;&#22768;&#26126;</a>&#20013;&#27599;&#20010;&#25317;&#26377;&#21463;&#32422;&#26463;<a href="cpp-language-auto.html">&#21344;&#20301;&#31867;&#22411;</a>&#30340;&#24418;&#21442;&#25152;&#24341;&#20837;&#30340;&#32422;&#26463;&#34920;&#36798;&#24335;;</li>
<li>&#23614;&#37096;&#30340; <i>requires</i> &#23376;&#21477;&#20013;&#30340;&#32422;&#26463;&#34920;&#36798;&#24335;&#12290;</li>
</ul>
<p>&#36825;&#20010;&#39034;&#24207;&#20915;&#23450;&#20102;&#22312;&#26816;&#26597;&#26159;&#21542;&#28385;&#36275;&#26102;&#21508;&#20010;&#32422;&#26463;&#26102;&#30340;&#23454;&#20363;&#21270;&#39034;&#24207;&#12290;</p>
<p>&#21463;&#32422;&#26463;&#30340;&#22768;&#26126;&#21482;&#33021;&#20197;&#30456;&#21516;&#30340;&#35821;&#27861;&#24418;&#24335;&#37325;&#22768;&#26126;&#12290;&#19981;&#35201;&#27714;&#35786;&#26029;&#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>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>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="co1">// OK&#65306;&#37325;&#22768;&#26126;</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">// &#38750;&#33391;&#26500;&#65292;&#19981;&#35201;&#27714;&#35786;&#26029;</span>
<span class="co1">// &#19979;&#21015;&#20004;&#20010;&#22768;&#26126;&#25317;&#26377;&#19981;&#21516;&#30340;&#32422;&#26463;&#65306;</span>
<span class="co1">// &#31532;&#19968;&#20010;&#22768;&#26126;&#25317;&#26377; Incrementable&lt;T&gt; &amp;&amp; Decrementable&lt;T&gt;</span>
<span class="co1">// &#31532;&#20108;&#20010;&#22768;&#26126;&#25317;&#26377; Decrementable&lt;T&gt; &amp;&amp; Incrementable&lt;T&gt;</span>
<span class="co1">// &#23613;&#31649;&#23427;&#20204;&#22312;&#36923;&#36753;&#19978;&#31561;&#20215;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>Incrementable T<span class="sy1">&gt;</span>
<span class="kw4">void</span> g<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>Decrementable T<span class="sy1">&gt;</span>
<span class="kw4">void</span> g<span class="br0">(</span>T<span class="br0">)</span> requires Incrementable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// &#38750;&#33391;&#26500;&#65292;&#19981;&#35201;&#27714;&#35786;&#26029;</span></pre></div>
</div>
<h4><span class="mw-headline" id=".E5.90.88.E5.8F.96">&#21512;&#21462;</span></h4>
<p>&#20004;&#20010;&#32422;&#26463;&#30340;&#21512;&#21462;&#26159;&#36890;&#36807;&#22312;&#32422;&#26463;&#34920;&#36798;&#24335;&#20013;&#20351;&#29992; <code>&amp;&amp;</code> &#36816;&#31639;&#31526;&#26469;&#26500;&#25104;&#30340;&#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">class</span> T<span class="sy1">&gt;</span>
concept 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 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 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>&#20004;&#20010;&#32422;&#26463;&#30340;&#21512;&#21462;&#21482;&#26377;&#22312;&#20004;&#20010;&#32422;&#26463;&#37117;&#34987;&#28385;&#36275;&#26102;&#25165;&#20250;&#24471;&#21040;&#28385;&#36275;&#12290;&#21512;&#21462;&#20174;&#24038;&#21040;&#21491;&#30701;&#36335;&#27714;&#20540;&#65288;&#22914;&#26524;&#19981;&#28385;&#36275;&#24038;&#20391;&#30340;&#32422;&#26463;&#65292;&#37027;&#20040;&#23601;&#19981;&#20250;&#23581;&#35797;&#23545;&#21491;&#20391;&#30340;&#32422;&#26463;&#36827;&#34892;&#27169;&#26495;&#23454;&#21442;&#26367;&#25442;&#65306;&#36825;&#26679;&#23601;&#20250;&#38450;&#27490;&#20986;&#29616;&#31435;&#21363;&#35821;&#22659;&#22806;&#30340;&#26367;&#25442;&#25152;&#23548;&#33268;&#30340;&#22833;&#36133;&#65289;&#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="kw4">constexpr</span> <span class="kw4">bool</span> get_value<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> T<span class="sy4">::</span><span class="me2">value</span><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 <span class="br0">(</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="br0">)</span>
<span class="kw4">void</span> f<span class="br0">(</span>T<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #1</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #2</span>
<span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
f<span class="br0">(</span><span class="st0">&#39;A&#39;</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65292;&#35843;&#29992; #2&#12290;&#24403;&#26816;&#26597; #1 &#30340;&#32422;&#26463;&#26102;&#65292;</span>
<span class="co1">// &#19981;&#28385;&#36275; &#39;sizeof(char) &gt; 1&#39;&#65292;&#25925;&#19981;&#26816;&#26597; get_value&lt;T&gt;()</span>
<span class="br0">}</span></pre></div>
</div>
<h4><span class="mw-headline" id=".E6.9E.90.E5.8F.96">&#26512;&#21462;</span></h4>
<p>&#20004;&#20010;&#32422;&#26463;&#30340;&#26512;&#21462;&#65292;&#26159;&#36890;&#36807;&#22312;&#32422;&#26463;&#34920;&#36798;&#24335;&#20013;&#20351;&#29992; <code>||</code> &#36816;&#31639;&#31526;&#26469;&#26500;&#25104;&#30340;&#65306;</p>
<p>&#22914;&#26524;&#20854;&#20013;&#19968;&#20010;&#32422;&#26463;&#24471;&#21040;&#28385;&#36275;&#65292;&#37027;&#20040;&#20004;&#20010;&#32422;&#26463;&#30340;&#26512;&#21462;&#30340;&#21040;&#28385;&#36275;&#12290;&#26512;&#21462;&#20174;&#24038;&#21040;&#21491;&#30701;&#36335;&#27714;&#20540;&#65288;&#22914;&#26524;&#28385;&#36275;&#24038;&#20391;&#32422;&#26463;&#65292;&#37027;&#20040;&#23601;&#19981;&#20250;&#23581;&#35797;&#23545;&#21491;&#20391;&#32422;&#26463;&#36827;&#34892;&#27169;&#26495;&#23454;&#21442;&#26367;&#25442;&#65289;&#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">=</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="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=".E4.B8.8D.E5.8F.AF.E5.88.86.E5.89.B2.E7.BA.A6.E6.9D.9F">&#19981;&#21487;&#20998;&#21106;&#32422;&#26463;</span></h4>
<p>&#19981;&#21487;&#20998;&#21106;&#32422;&#26463;&#30001;&#19968;&#20010;&#34920;&#36798;&#24335; <code>E</code>&#65292;&#21644;&#19968;&#20010;&#20174; <code>E</code> &#20869;&#20986;&#29616;&#30340;&#27169;&#26495;&#24418;&#21442;&#21040;&#65288;&#23545;&#21463;&#32422;&#26463;&#23454;&#20307;&#30340;&#21508;&#27169;&#26495;&#24418;&#21442;&#30340;&#26377;&#25152;&#28041;&#21450;&#30340;&#65289;&#27169;&#26495;&#23454;&#21442;&#30340;&#26144;&#23556;&#32452;&#25104;&#12290;&#36825;&#31181;&#26144;&#23556;&#34987;&#31216;&#20316;<i>&#24418;&#21442;&#26144;&#23556;</i>&#12290;</p>
<p>&#19981;&#21487;&#20998;&#21106;&#32422;&#26463;&#22312;<a href="cpp-language-constraints.html#.E7.BA.A6.E6.9D.9F.E8.A7.84.E8.8C.83.E5.8C.96">&#32422;&#26463;&#35268;&#33539;&#21270;</a>&#36807;&#31243;&#20013;&#24418;&#25104;&#12290;<code>E</code> &#22987;&#32456;&#19981;&#20250;&#26159;&#36923;&#36753;&#19982;&#65288;AND&#65289;&#25110;&#32773;&#36923;&#36753;&#25110;&#65288;OR&#65289;&#34920;&#36798;&#24335;&#65288;&#23427;&#20204;&#20998;&#21035;&#26500;&#25104;&#26512;&#21462;&#21644;&#21512;&#21462;&#65289;&#12290;</p>
<p>&#23545;&#19981;&#21487;&#20998;&#21106;&#32422;&#26463;&#26159;&#21542;&#28385;&#36275;&#30340;&#26816;&#26597;&#20250;&#36890;&#36807;&#26367;&#25442;&#24418;&#21442;&#26144;&#23556;&#21644;&#21508;&#20010;&#27169;&#26495;&#23454;&#21442;&#21040;&#34920;&#36798;&#24335; <code>E</code> &#20013;&#26469;&#36827;&#34892;&#12290;&#22914;&#26524;&#26367;&#25442;&#20135;&#29983;&#20102;&#26080;&#25928;&#30340;&#31867;&#22411;&#25110;&#34920;&#36798;&#24335;&#65292;&#37027;&#20040;&#32422;&#26463;&#23601;&#27809;&#26377;&#34987;&#28385;&#36275;&#12290;&#21542;&#21017;&#65292;&#22312;&#20219;&#20309;&#24038;&#20540;&#21040;&#21491;&#20540;&#36716;&#25442;&#21518;&#65292;<code>E</code> &#24212;&#24403;&#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span> &#31867;&#22411;&#30340;&#32431;&#21491;&#20540;&#24120;&#37327;&#34920;&#36798;&#24335;&#65292;&#24403;&#19988;&#20165;&#24403;&#23427;&#27714;&#20540;&#20026; <code>true</code> &#26102;&#35813;&#32422;&#26463;&#24471;&#20197;&#28385;&#36275;&#12290;</p>
<p><code>E</code> &#22312;&#26367;&#25442;&#21518;&#30340;&#31867;&#22411;&#24517;&#39035;&#20005;&#26684;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span>&#12290;&#19981;&#33021;&#26377;&#20219;&#20309;&#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> 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 <span class="br0">(</span>S<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">{</span><span class="br0">}</span><span class="br0">)</span>
<span class="kw4">void</span> f<span class="br0">(</span>T<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #1</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #2</span>
<span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</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;&#26816;&#26597; #1 &#26102; S&lt;int&gt;{} &#19981;&#20855;&#26377; bool &#31867;&#22411;&#65292;</span>
<span class="co1">// &#23613;&#31649; #2 &#33021;&#26356;&#22909;&#22320;&#21305;&#37197;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#22914;&#26524;&#20004;&#20010;&#19981;&#21487;&#20998;&#21106;&#32422;&#26463;&#30001;&#22312;&#28304;&#30721;&#23618;&#38754;&#19978;&#30456;&#21516;&#30340;&#34920;&#36798;&#24335;&#32452;&#25104;&#65292;&#19988;&#23427;&#20204;&#30340;&#24418;&#21442;&#26144;&#23556;&#31561;&#20215;&#65292;&#37027;&#20040;&#35748;&#20026;&#23427;&#20204;<i>&#31561;&#21516;</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">class</span> T<span class="sy1">&gt;</span>
<span class="kw4">constexpr</span> <span class="kw4">bool</span> is_meowable <span class="sy1">=</span> <span class="kw2">true</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>
<span class="kw4">constexpr</span> <span class="kw4">bool</span> is_cat <span class="sy1">=</span> <span class="kw2">true</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 Meowable <span class="sy1">=</span> is_meowable<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">class</span> T<span class="sy1">&gt;</span>
concept BadMeowableCat <span class="sy1">=</span> is_meowable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="sy3">&amp;&amp;</span> is_cat<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">class</span> T<span class="sy1">&gt;</span>
concept GoodMeowableCat <span class="sy1">=</span> Meowable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="sy3">&amp;&amp;</span> is_cat<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>Meowable T<span class="sy1">&gt;</span>
<span class="kw4">void</span> f1<span class="br0">(</span>T<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #1</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>BadMeowableCat T<span class="sy1">&gt;</span>
<span class="kw4">void</span> f1<span class="br0">(</span>T<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #2</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>Meowable T<span class="sy1">&gt;</span>
<span class="kw4">void</span> f2<span class="br0">(</span>T<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #3</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>GoodMeowableCat T<span class="sy1">&gt;</span>
<span class="kw4">void</span> f2<span class="br0">(</span>T<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #4</span>
<span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
f1<span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65292;&#26377;&#27495;&#20041;&#65306;</span>
<span class="co1">// BadMeowableCat &#21644; Meowable &#20013;&#30340; is_meowable&lt;T&gt;</span>
<span class="co1">// &#26500;&#25104;&#20102;&#26377;&#21306;&#21035;&#30340;&#19981;&#21487;&#20998;&#21106;&#32422;&#26463;&#19988;&#23427;&#20204;&#24182;&#19981;&#31561;&#21516;&#65288;&#22240;&#27492;&#23427;&#20204;&#19981;&#20114;&#30456;&#21253;&#21547;&#65289;</span>
f2<span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65292;&#35843;&#29992; #4&#65292;&#23427;&#27604; #3 &#26356;&#21463;&#32422;&#26463;</span>
<span class="co1">// GoodMeowableCat &#20174; Meowable &#33719;&#24471;&#20854; is_meowable&lt;T&gt;</span>
<span class="br0">}</span></pre></div>
</div>
<h4><span class="mw-headline" id=".E7.BA.A6.E6.9D.9F.E8.A7.84.E8.8C.83.E5.8C.96">&#32422;&#26463;&#35268;&#33539;&#21270;</span></h4>
<p><i>&#32422;&#26463;&#35268;&#33539;&#21270;</i>&#26159;&#23558;&#19968;&#20010;&#32422;&#26463;&#34920;&#36798;&#24335;&#21464;&#25442;&#20026;&#19968;&#20010;&#19981;&#21487;&#20998;&#21106;&#32422;&#26463;&#30340;&#21512;&#21462;&#19982;&#26512;&#21462;&#30340;&#24207;&#21015;&#30340;&#36807;&#31243;&#12290;&#34920;&#36798;&#24335;&#30340;<i>&#33539;&#24335;</i>&#23450;&#20041;&#22914;&#19979;&#65306;</p>
<ul>
<li>&#34920;&#36798;&#24335; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">(</span>E<span class="br0">)</span></span></span> &#30340;&#33539;&#24335;&#23601;&#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp">E</span></span> &#30340;&#33539;&#24335;&#65307;</li>
<li>&#34920;&#36798;&#24335; <span class="t-c"><span class="mw-geshi cpp source-cpp">E1 <span class="sy3">&amp;&amp;</span> E2</span></span> &#30340;&#33539;&#24335;&#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp">E1</span></span> &#21644; <span class="t-c"><span class="mw-geshi cpp source-cpp">E2</span></span> &#33539;&#24335;&#30340;&#21512;&#21462;&#65307;</li>
<li>&#34920;&#36798;&#24335; <span class="t-c"><span class="mw-geshi cpp source-cpp">E1 <span class="sy3">||</span> E2</span></span> &#30340;&#33539;&#24335;&#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp">E1</span></span> &#21644; <span class="t-c"><span class="mw-geshi cpp source-cpp">E2</span></span> &#33539;&#24335;&#30340;&#26512;&#21462;&#65307;</li>
<li>&#34920;&#36798;&#24335; <span class="t-c"><span class="mw-geshi cpp source-cpp">C<span class="sy1">&lt;</span>A1, A2, ... , AN<span class="sy1">&gt;</span></span></span>&#65288;&#20854;&#20013; <code>C</code> &#25351;&#21517;&#26576;&#20010;&#27010;&#24565;&#65289;&#30340;&#33539;&#24335;&#65292;&#26159;&#20197; A1, A2, ... , AN &#23545; C &#30340;&#27599;&#20010;&#19981;&#21487;&#20998;&#21106;&#32422;&#26463;&#30340;&#24418;&#21442;&#26144;&#23556;&#20013;&#30340; <code>C</code> &#30340;&#23545;&#24212;&#27169;&#26495;&#24418;&#21442;&#36827;&#34892;&#26367;&#25442;&#20043;&#21518;&#65292;<code>C</code> &#30340;&#32422;&#26463;&#34920;&#36798;&#24335;&#30340;&#33539;&#24335;&#12290;&#22914;&#26524;&#22312;&#36825;&#31181;&#24418;&#21442;&#26144;&#23556;&#20013;&#30340;&#26367;&#25442;&#20135;&#29983;&#20102;&#26080;&#25928;&#30340;&#31867;&#22411;&#25110;&#34920;&#36798;&#24335;&#65292;&#37027;&#20040;&#31243;&#24207;&#38750;&#33391;&#26500;&#65292;&#19981;&#35201;&#27714;&#35786;&#26029;&#12290;</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">typename</span> T<span class="sy1">&gt;</span>
concept A <span class="sy1">=</span> T<span class="sy4">::</span><span class="me2">value</span> <span class="sy3">||</span> <span class="kw2">true</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> U<span class="sy1">&gt;</span>
concept B <span class="sy1">=</span> A<span class="sy1">&lt;</span>U<span class="sy2">*</span><span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#35268;&#33539;&#21270;&#20026;&#20197;&#19979;&#21508;&#39033;&#30340;&#26512;&#21462;</span>
<span class="co1">// - T::value&#65288;&#26144;&#23556;&#20026; T -&gt; U*&#65289;&#21644;</span>
<span class="co1">// - true&#65288;&#26144;&#23556;&#20026;&#31354;&#65289;&#12290;</span>
<span class="co1">// &#26144;&#23556;&#20013;&#27809;&#26377;&#26080;&#25928;&#31867;&#22411;&#65292;&#23613;&#31649; T::value &#23545;&#25152;&#26377;&#25351;&#38024;&#31867;&#22411;&#22343;&#38750;&#33391;&#26500;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> V<span class="sy1">&gt;</span>
concept C <span class="sy1">=</span> B<span class="sy1">&lt;</span>V<span class="sy3">&amp;</span><span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// &#35268;&#33539;&#21270;&#20026;&#20197;&#19979;&#30340;&#26512;&#21462;</span>
<span class="co1">// - T::value&#65288;&#26144;&#23556;&#20026; T-&gt; V&amp;*&#65289;&#21644;</span>
<span class="co1">// - true&#65288;&#26144;&#23556;&#20026;&#31354;&#65289;&#12290;</span>
<span class="co1">// &#26144;&#23556;&#20013;&#26500;&#25104;&#20102;&#26080;&#25928;&#31867;&#22411; V&amp;* =&gt; &#38750;&#33391;&#26500;&#65292;&#19981;&#35201;&#27714;&#35786;&#26029;</span></pre></div>
</div>
<ul>
<li>&#20219;&#20309;&#20854;&#20182;&#34920;&#36798;&#24335; <span class="t-c"><span class="mw-geshi cpp source-cpp">E</span></span> &#30340;&#33539;&#24335;&#26159;&#19968;&#26465;&#19981;&#21487;&#20998;&#21106;&#32422;&#26463;&#65292;&#23427;&#30340;&#34920;&#36798;&#24335;&#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp">E</span></span> &#32780;&#23427;&#30340;&#24418;&#21442;&#26144;&#23556;&#26159;&#24658;&#31561;&#26144;&#23556;&#12290;&#36825;&#21253;&#25324;&#25152;&#26377;<a href="cpp-language-fold.html">&#25240;&#21472;&#34920;&#36798;&#24335;</a>&#65292;&#29978;&#33267;&#21253;&#25324;&#20197; <code>&amp;&amp;</code> &#25110; <code>||</code> &#36816;&#31639;&#31526;&#36827;&#34892;&#30340;&#25240;&#21472;&#12290;</li>
</ul>
<p>&#29992;&#25143;&#23450;&#20041;&#30340; <code>&amp;&amp;</code> &#25110; <code>||</code> &#37325;&#36733;&#22312;&#32422;&#26463;&#35268;&#33539;&#21270;&#19978;&#26080;&#25928;&#12290;</p>
<h3><span class="mw-headline" id="requires_.E5.AD.90.E5.8F.A5">requires &#23376;&#21477;</span></h3>
<p>&#20851;&#38190;&#35789; <span class="t-c"><span class="mw-geshi cpp source-cpp">requires</span></span> &#29992;&#26469;&#24341;&#20837; <i>requires &#23376;&#21477;</i>&#65292;&#23427;&#25351;&#23450;&#23545;&#21508;&#27169;&#26495;&#23454;&#21442;&#65292;&#25110;&#23545;&#20989;&#25968;&#22768;&#26126;&#30340;&#32422;&#26463;&#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="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">// &#21487;&#20197;&#20316;&#20026;&#20989;&#25968;&#22768;&#26126;&#31526;&#30340;&#26411;&#23614;&#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;&#32773;&#22312;&#27169;&#26495;&#24418;&#21442;&#21015;&#34920;&#30340;&#21491;&#36793;</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>
<p>&#36825;&#31181;&#24773;&#20917;&#19979;&#65292;&#20851;&#38190;&#35789; <i>requires</i> &#24517;&#39035;&#21518;&#38543;&#26576;&#20010;&#24120;&#37327;&#34920;&#36798;&#24335;&#65288;&#22240;&#27492;&#21487;&#20197;&#20889;&#25104; <span class="t-c"><span class="mw-geshi cpp source-cpp">requires <span class="kw2">true</span></span></span>&#65289;&#65292;&#20294;&#36825;&#26159;&#20026;&#20102;&#20351;&#29992;&#19968;&#20010;&#20855;&#21517;&#27010;&#24565;&#65288;&#22914;&#19978;&#20363;&#65289;&#65292;&#20855;&#21517;&#27010;&#24565;&#30340;&#19968;&#26465;&#21512;&#21462;/&#26512;&#21462;&#65292;&#25110;&#32773;&#19968;&#20010; <i>requires &#34920;&#36798;&#24335;</i>&#12290;</p>
<p>&#34920;&#36798;&#24335;&#24517;&#39035;&#20855;&#26377;&#19979;&#21015;&#24418;&#24335;&#20043;&#19968;&#65306;</p>
<ul>
<li><a href="cpp-language-expressions.html#.E5.88.9D.E7.AD.89.E8.A1.A8.E8.BE.BE.E5.BC.8F">&#21021;&#31561;&#34920;&#36798;&#24335;</a>&#65292;&#20363;&#22914; <span class="t-c"><span class="mw-geshi cpp source-cpp">Swappable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span></span></span>&#12289;<span class="t-c"><span class="mw-geshi cpp source-cpp"><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></span>&#12289;<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">(</span><a href="cpp-types-is_object.html"><span class="kw487">std::<span class="me2">is_object_v</span></span></a><span class="sy1">&lt;</span>Args<span class="sy1">&gt;</span> <span class="sy3">&amp;&amp;</span> ...<span class="br0">)</span></span></span> &#25110;&#20219;&#20309;&#24102;&#25324;&#21495;&#30340;&#34920;&#36798;&#24335;</li>
<li>&#20197;&#36816;&#31639;&#31526; <code>&amp;&amp;</code> &#32852;&#32467;&#30340;&#21021;&#31561;&#34920;&#36798;&#24335;&#30340;&#24207;&#21015;</li>
<li>&#20197;&#36816;&#31639;&#31526; <code>||</code> &#32852;&#32467;&#30340;&#21069;&#36848;&#34920;&#36798;&#24335;&#30340;&#24207;&#21015;</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>
<span class="kw4">constexpr</span> <span class="kw4">bool</span> is_meowable <span class="sy1">=</span> <span class="kw2">true</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>
<span class="kw4">constexpr</span> <span class="kw4">bool</span> is_purrable<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="kw1">class</span> T<span class="sy1">&gt;</span>
<span class="kw4">void</span> f<span class="br0">(</span>T<span class="br0">)</span> requires is_meowable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// OK</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
<span class="kw4">void</span> g<span class="br0">(</span>T<span class="br0">)</span> requires is_purrable<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">// &#38169;&#35823;&#65306;is_purrable&lt;T&gt;() &#19981;&#26159;&#21021;&#31561;&#34920;&#36798;&#24335;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
<span class="kw4">void</span> h<span class="br0">(</span>T<span class="br0">)</span> requires <span class="br0">(</span>is_purrable<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK</span></pre></div>
</div>
<h3><span class="mw-headline" id="requires_.E8.A1.A8.E8.BE.BE.E5.BC.8F">requires &#34920;&#36798;&#24335;</span></h3>
<p>&#20851;&#38190;&#35789; <span class="t-c"><span class="mw-geshi cpp source-cpp">requires</span></span> &#20063;&#29992;&#26469;&#24320;&#22987;&#19968;&#20010; <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;&#30340;&#32431;&#21491;&#20540;&#34920;&#36798;&#24335;&#65292;&#25551;&#36848;&#23545;&#19968;&#20123;&#27169;&#26495;&#23454;&#21442;&#30340;&#32422;&#26463;&#12290;&#36825;&#31181;&#34920;&#36798;&#24335;&#22312;&#32422;&#26463;&#24471;&#21040;&#28385;&#36275;&#26102;&#26159; <code>true</code>&#65292;&#21542;&#21017;&#26159; <code>false</code>&#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 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;&#19981;&#26159; 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;&#30340;&#32422;&#26463;&#65292;&#27880;&#24847;&#20851;&#38190;&#23383;&#34987;&#20351;&#29992;&#20004;&#27425;</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>
<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">&#35201;&#27714;&#24207;&#21015;</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>
<tr class="t-sdsc">
<td class="t-sdsc-nopad"><code><b>requires</b></code> <code><b>(</b></code> <span class="t-spar">&#24418;&#21442;&#21015;&#34920;</span><span class="t-mark">(&#21487;&#36873;)</span> <code><b>)</b></code> <code><b>{</b></code> <span class="t-spar">&#35201;&#27714;&#24207;&#21015;</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">&#24418;&#21442;&#21015;&#34920;</span></td>
<td>-</td>
<td>&#19982;&#20989;&#25968;&#22768;&#26126;&#20013;&#31867;&#20284;&#30340;&#20197;&#36887;&#21495;&#20998;&#38548;&#30340;&#24418;&#21442;&#21015;&#34920;&#65292;&#20294;&#19981;&#33021;&#26377;&#40664;&#35748;&#23454;&#21442;&#19988;&#19981;&#33021;&#20197;&#65288;&#24182;&#38750;&#25351;&#23450;&#21253;&#23637;&#24320;&#30340;&#65289;&#30465;&#30053;&#21495;&#32467;&#23614;&#12290;&#36825;&#20123;&#24418;&#21442;&#27809;&#26377;&#23384;&#20648;&#26399;&#12289;&#36830;&#25509;&#25110;&#29983;&#23384;&#26399;&#65292;&#23427;&#20204;&#21482;&#20250;&#29992;&#26469;&#36741;&#21161;&#36827;&#34892;&#21508;&#20010;&#35201;&#27714;&#30340;&#21046;&#23450;&#12290;&#36825;&#20123;&#24418;&#21442;&#22312; <span class="t-spar">&#35201;&#27714;&#24207;&#21015;</span> &#30340;&#38381; <code><b>}</b></code> &#21069;&#22788;&#20110;&#20316;&#29992;&#22495;&#20013;&#12290;</td>
</tr>
<tr class="t-par">
<td><span class="t-spar">&#35201;&#27714;&#24207;&#21015;</span></td>
<td>-</td>
<td><i>&#35201;&#27714;&#65288;requirement&#65289;</i>&#30340;&#24207;&#21015;&#65292;&#25551;&#36848;&#20110;&#19979;&#65288;&#27599;&#20010;&#35201;&#27714;&#20197;&#20998;&#21495;&#32467;&#23614;&#65289;&#12290;</td>
</tr>
</table>
<p><span class="t-spar">&#35201;&#27714;&#24207;&#21015;</span> &#20013;&#30340;&#27599;&#20010;&#35201;&#27714;&#26159;&#19979;&#21015;&#20043;&#19968;&#65306;</p>
<ul>
<li>&#31616;&#21333;&#35201;&#27714;&#65288;simple requirement&#65289;</li>
<li>&#31867;&#22411;&#35201;&#27714;&#65288;type requirement&#65289;</li>
<li>&#22797;&#21512;&#35201;&#27714;&#65288;compound requirement&#65289;</li>
<li>&#23884;&#22871;&#35201;&#27714;&#65288;nested requirement&#65289;</li>
</ul>
<p>&#35201;&#27714;&#21487;&#20197;&#25552;&#21450;&#22788;&#20110;&#20316;&#29992;&#22495;&#20013;&#30340;&#27169;&#26495;&#24418;&#21442;&#65292;&#30001; <span class="t-spar">&#24418;&#21442;&#21015;&#34920;</span> &#24341;&#20837;&#30340;&#23616;&#37096;&#24418;&#21442;&#65292;&#20197;&#21450;&#20174;&#23427;&#30340;&#22806;&#22260;&#35821;&#22659;&#20013;&#21487;&#35265;&#30340;&#20219;&#20309;&#20854;&#20182;&#22768;&#26126;&#12290;</p>
<p>&#23545;<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;&#25152;&#20351;&#29992;&#30340; requires &#34920;&#36798;&#24335;&#36827;&#34892;&#27169;&#26495;&#23454;&#21442;&#26367;&#25442;&#65292;&#21487;&#33021;&#23548;&#33268;&#22312;&#20854;&#35201;&#27714;&#20013;&#24418;&#25104;&#26080;&#25928;&#30340;&#31867;&#22411;&#25110;&#34920;&#36798;&#24335;&#65292;&#25110;&#36829;&#21453;&#36825;&#20123;&#35201;&#27714;&#30340;&#35821;&#20041;&#32422;&#26463;&#12290;&#36825;&#20123;&#24773;&#20917;&#19979;&#65292;&#35813; requires &#34920;&#36798;&#24335;&#27714;&#20540;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span> &#32780;&#19981;&#20250;&#23548;&#33268;&#31243;&#24207;&#38750;&#33391;&#26500;&#12290;&#26367;&#25442;&#21644;&#35821;&#20041;&#32422;&#26463;&#26816;&#26597;&#25353;&#35789;&#27861;&#39034;&#24207;&#25191;&#34892;&#65292;&#24182;&#22312;&#36935;&#21040;&#30830;&#23450; requires &#34920;&#36798;&#24335;&#32467;&#26524;&#30340;&#26465;&#20214;&#26102;&#20572;&#27490;&#12290;&#22914;&#26524;&#26367;&#25442;&#65288;&#22914;&#26524;&#23384;&#22312;&#65289;&#21644;&#35821;&#20041;&#32422;&#26463;&#26816;&#26597;&#25104;&#21151;&#65292;&#37027;&#20040; requires &#34920;&#36798;&#24335;&#27714;&#20540;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span>&#12290;</p>
<p>&#22914;&#26524;&#23545;&#20110;&#27599;&#19968;&#31181;&#21487;&#33021;&#30340;&#27169;&#26495;&#23454;&#21442; requires &#34920;&#36798;&#24335;&#20013;&#37117;&#20250;&#20986;&#29616;&#26367;&#25442;&#22833;&#36133;&#65292;&#37027;&#20040;&#31243;&#24207;&#38750;&#33391;&#26500;&#65292;&#19981;&#35201;&#27714;&#35786;&#26029;&#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">class</span> T<span class="sy1">&gt;</span>
concept 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 &#22343;&#20026;&#26080;&#25928;&#65306;&#38750;&#33391;&#26500;&#65292;&#19981;&#35201;&#27714;&#35786;&#26029;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<p>&#22914;&#26524; requires &#34920;&#36798;&#24335;&#22312;&#23427;&#30340;&#32422;&#26463;&#20013;&#21547;&#26377;&#26080;&#25928;&#30340;&#31867;&#22411;&#25110;&#34920;&#36798;&#24335;&#65292;&#32780;&#23427;&#24182;&#19981;&#22312;<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;&#20869;&#20986;&#29616;&#65292;&#37027;&#20040;&#31243;&#24207;&#38750;&#33391;&#26500;&#12290;</p>
<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;&#19981;&#20197; <code>requires</code> &#20851;&#38190;&#35789;&#36215;&#22987;&#30340;&#20219;&#24847;&#34920;&#36798;&#24335;&#35821;&#21477;&#12290;&#23427;&#26029;&#35328;&#35813;&#34920;&#36798;&#24335;&#21512;&#27861;&#12290;&#35813;&#34920;&#36798;&#24335;&#26159;&#19981;&#27714;&#20540;&#25805;&#20316;&#25968;&#65307;&#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 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="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 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>
<p>&#20197; <code>requires</code> &#20851;&#38190;&#35789;&#36215;&#22987;&#30340;&#35201;&#27714;&#22987;&#32456;&#20250;&#34987;&#35299;&#35835;&#25104;&#23884;&#22871;&#35201;&#27714;&#12290;&#22240;&#27492;&#31616;&#21333;&#35201;&#27714;&#19981;&#33021;&#20197;&#26080;&#25324;&#21495;&#30340; requires &#34920;&#36798;&#24335;&#36215;&#22987;&#12290;</p>
<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;&#19968;&#20010;&#21487;&#20197;&#26377;&#38480;&#23450;&#30340;&#31867;&#22411;&#21517;&#12290;&#23427;&#30340;&#35201;&#27714;&#26159;&#35813;&#31867;&#22411;&#21517;&#21512;&#27861;&#65306;&#36825;&#21487;&#20197;&#29992;&#26469;&#26657;&#39564;&#26576;&#20010;&#20855;&#21517;&#23884;&#22871;&#31867;&#22411;&#23384;&#22312;&#65292;&#25110;&#26576;&#20010;&#31867;&#27169;&#26495;&#29305;&#21270;&#25351;&#21517;&#19968;&#20010;&#31867;&#22411;&#65292;&#25110;&#26576;&#20010;&#21035;&#21517;&#27169;&#26495;&#29305;&#21270;&#25351;&#21517;&#19968;&#20010;&#31867;&#22411;&#12290;&#25351;&#21517;&#31867;&#27169;&#26495;&#29305;&#21270;&#30340;&#31867;&#22411;&#35201;&#27714;&#19981;&#35201;&#27714;&#35813;&#31867;&#22411;&#23436;&#25972;&#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 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;&#26495;&#26367;&#25442;</span>
<span class="br0">}</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>
<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 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;&#24182;&#25351;&#21517;&#19968;&#20010;&#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;&#30340;&#24418;&#24335;&#20026;</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">&#34920;&#36798;&#24335;</span> <code><b>}</b></code> <code><b>noexcept</b></code><span class="t-mark">(&#21487;&#36873;)</span> <span class="t-spar">&#36820;&#22238;&#31867;&#22411;&#35201;&#27714;</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>
<table class="t-par-begin">
<tr class="t-par">
<td><span class="t-spar">&#36820;&#22238;&#31867;&#22411;&#35201;&#27714;</span></td>
<td>-</td>
<td><code><b>-&gt;</b></code> <span class="t-spar">&#31867;&#22411;&#32422;&#26463;</span></td>
</tr>
</table>
<p>&#24182;&#26029;&#35328;&#35813;&#20855;&#21517;&#34920;&#36798;&#24335;&#30340;&#21508;&#39033;&#24615;&#36136;&#12290;&#20197;&#19979;&#21015;&#39034;&#24207;&#36827;&#34892;&#26367;&#25442;&#21644;&#35821;&#20041;&#32422;&#26463;&#26816;&#26597;&#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> &#26367;&#25442;&#27169;&#26495;&#23454;&#21442;&#65288;&#33509;&#23384;&#22312;&#65289;&#21040; <span class="t-spar">&#34920;&#36798;&#24335;</span> &#20013;&#65307;</div>
<div class="t-li1"><span class="t-li">2)</span> &#22914;&#26524;&#20351;&#29992;&#20102; <code>noexcept</code>&#65292;&#37027;&#20040; <span class="t-spar">&#34920;&#36798;&#24335;</span> &#24517;&#39035;<a href="cpp-language-noexcept.html">&#19981;&#20250;&#25243;&#20986;</a>&#65307;</div>
<div class="t-li1"><span class="t-li">3)</span> &#22914;&#26524;&#20986;&#29616;&#20102; <span class="t-spar">&#36820;&#22238;&#31867;&#22411;&#35268;&#23450;</span>&#65292;&#37027;&#20040;&#65306;</div>
<div class="t-li2"><span class="t-li">a)</span> &#26367;&#25442;&#27169;&#26495;&#23454;&#21442;&#21040; <span class="t-spar">&#36820;&#22238;&#31867;&#22411;&#35268;&#23450;</span> &#20013;&#65307;</div>
<div class="t-li2"><span class="t-li">b)</span> <span class="t-c"><span class="mw-geshi cpp source-cpp">decltype<span class="br0">(</span><span class="br0">(</span>&#34920;&#36798;&#24335;<span class="br0">)</span><span class="br0">)</span></span></span> &#24517;&#39035;&#28385;&#36275;&#26377;&#35813; <span class="t-spar">&#31867;&#22411;&#32422;&#26463;</span> &#25152;&#34164;&#21547;&#30340;&#32422;&#26463;&#12290;&#21542;&#21017;&#65292;&#22806;&#22260; requires &#34920;&#36798;&#24335;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span>&#12290;</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 C2 <span class="sy1">=</span> requires<span class="br0">(</span>T x<span class="br0">)</span>
<span class="br0">{</span>
<span class="co1">// &#34920;&#36798;&#24335; *x &#24517;&#39035;&#21512;&#27861;</span>
<span class="co1">// &#24182;&#19988;&#31867;&#22411; T::inner &#24517;&#39035;&#21512;&#27861;</span>
<span class="co1">// &#24182;&#19988; *x &#30340;&#32467;&#26524;&#24517;&#39035;&#21487;&#20197;&#36716;&#25442;&#20026; T::inner</span>
<span class="br0">{</span><span class="sy2">*</span>x<span class="br0">}</span> <span class="sy2">-</span><span class="sy1">&gt;</span> std<span class="sy4">::</span><span class="me2">convertible_to</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy4">::</span><span class="me2">inner</span><span class="sy1">&gt;</span><span class="sy4">;</span>
<span class="co1">// &#34920;&#36798;&#24335; x + 1 &#24517;&#39035;&#21512;&#27861;</span>
<span class="co1">// &#24182;&#19988; std::Same&lt;decltype((x + 1)), int&gt; &#24517;&#39035;&#34987;&#28385;&#36275;</span>
<span class="co1">// &#20063;&#23601;&#26159;&#35828;&#65292;(x + 1) &#24517;&#39035;&#26159; int &#31867;&#22411;&#30340;&#32431;&#21491;&#20540;</span>
<span class="br0">{</span>x <span class="sy2">+</span> <span class="nu0">1</span><span class="br0">}</span> <span class="sy2">-</span><span class="sy1">&gt;</span> std<span class="sy4">::</span><span class="me2">same_as</span><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span><span class="sy4">;</span>
<span class="co1">// &#34920;&#36798;&#24335; x * 1 &#24517;&#39035;&#21512;&#27861;</span>
<span class="co1">// &#24182;&#19988;&#23427;&#30340;&#32467;&#26524;&#24517;&#39035;&#21487;&#20197;&#36716;&#25442;&#21040; T</span>
<span class="br0">{</span>x <span class="sy2">*</span> <span class="nu0">1</span><span class="br0">}</span> <span class="sy2">-</span><span class="sy1">&gt;</span> std<span class="sy4">::</span><span class="me2">convertible_to</span><span class="sy1">&lt;</span>T<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;&#30340;&#24418;&#24335;&#20026;</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> <span class="t-spar">&#32422;&#26463;&#34920;&#36798;&#24335;</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>&#23427;&#21487;&#20197;&#29992;&#26469;&#20197;&#23616;&#37096;&#24418;&#21442;&#26469;&#25351;&#23450;&#39069;&#22806;&#30340;&#32422;&#26463;&#12290;<span class="t-spar">&#32422;&#26463;&#34920;&#36798;&#24335;</span> &#24517;&#39035;&#34987;&#25152;&#26367;&#25442;&#30340;&#27169;&#26495;&#23454;&#21442;&#65288;&#22914;&#26524;&#23384;&#22312;&#65289;&#25152;&#28385;&#36275;&#12290;&#22312;&#23884;&#22871;&#35201;&#27714;&#20013;&#36827;&#34892;&#27169;&#26495;&#23454;&#21442;&#30340;&#26367;&#25442;&#25152;&#23548;&#33268;&#30340;&#22312; <span class="t-spar">&#32422;&#26463;&#34920;&#36798;&#24335;</span> &#20013;&#30340;&#26367;&#25442;&#21482;&#20250;&#36827;&#34892;&#21040;&#36275;&#20197;&#30830;&#23450; <span class="t-spar">&#32422;&#26463;&#34920;&#36798;&#24335;</span> &#26159;&#21542;&#24471;&#21040;&#28385;&#36275;&#25152;&#38656;&#30340;&#31243;&#24230;&#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 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=".E7.BA.A6.E6.9D.9F.E7.9A.84.E5.81.8F.E5.BA.8F">&#32422;&#26463;&#30340;&#20559;&#24207;</span></h3>
<p>&#22312;&#20219;&#20309;&#36827;&#19968;&#27493;&#30340;&#20998;&#26512;&#20043;&#21069;&#37117;&#20250;&#23545;&#21508;&#20010;&#32422;&#26463;&#36827;&#34892;<a href="cpp-language-constraints.html#.E7.BA.A6.E6.9D.9F.E8.A7.84.E8.8C.83.E5.8C.96">&#35268;&#33539;&#21270;</a>&#65292;&#23545;&#27599;&#20010;&#20855;&#21517;&#27010;&#24565;&#30340;&#20027;&#20307;&#21644;&#27599;&#20010; requires &#34920;&#36798;&#24335;&#36827;&#34892;&#26367;&#25442;&#65292;&#30452;&#21040;&#21097;&#19979;&#19981;&#21487;&#20998;&#21106;&#32422;&#26463;&#30340;&#21512;&#21462;&#19982;&#26512;&#21462;&#30340;&#24207;&#21015;&#20026;&#27490;&#12290;</p>
<p>&#22914;&#26524;&#26681;&#25454;&#32422;&#26463; <code>P</code> &#21644;&#32422;&#26463; <code>Q</code> &#20013;&#30340;&#21508;&#19981;&#21487;&#20998;&#21106;&#32422;&#26463;&#30340;&#21516;&#19968;&#24615;&#21487;&#20197;&#35777;&#26126; <code>P</code> <a href="https://en.wikipedia.org/wiki/Logical_consequence" class="extiw" title="enwiki:Logical consequence">&#34164;&#21547;</a> <code>Q</code>&#65292;&#37027;&#20040;&#31216; <code>P</code> <i>&#24402;&#20837;&#65288;subsume&#65289;</i> <code>Q</code>&#12290;&#65288;&#24182;&#36827;&#34892;&#31867;&#22411;&#21644;&#34920;&#36798;&#24335;&#30340;&#31561;&#20215;&#24615;&#20998;&#26512;&#65306;<code>N &gt; 0</code> &#24182;&#19981;&#24402;&#20837; <code>N &gt;= 0</code>&#65289;&#12290;</p>
<p>&#20855;&#20307;&#26469;&#35828;&#65292;&#39318;&#20808;&#36716;&#25442; <code>P</code> &#20026;&#26512;&#21462;&#33539;&#24335;&#24182;&#36716;&#25442; <code>Q</code> &#20026;&#21512;&#21462;&#33539;&#24335;&#12290;&#24403;&#19988;&#20165;&#24403;&#20197;&#19979;&#24773;&#20917;&#19979; <code>P</code> &#24402;&#20837; <code>Q</code>&#65306;</p>
<ul>
<li><code>P</code> &#30340;&#26512;&#21462;&#33539;&#24335;&#20013;&#30340;&#27599;&#20010;&#26512;&#21462;&#23376;&#21477;&#37117;&#33021;&#24402;&#20837; <code>Q</code> &#30340;&#21512;&#21462;&#33539;&#24335;&#20013;&#30340;&#27599;&#20010;&#21512;&#21462;&#23376;&#21477;&#65292;&#20854;&#20013;</li>
<li>&#24403;&#19988;&#20165;&#24403;&#26512;&#21462;&#23376;&#21477;&#20013;&#23384;&#22312;&#19981;&#21487;&#20998;&#21106;&#32422;&#26463; <code>U</code> &#32780;&#21512;&#21462;&#23376;&#21477;&#20013;&#23384;&#22312;&#19981;&#21487;&#20998;&#21106;&#32422;&#26463; <code>V</code>&#65292;&#20351;&#24471; <code>U</code> &#24402;&#20837; <code>V</code> &#26102;&#65292;&#26512;&#21462;&#23376;&#21477;&#33021;&#24402;&#20837;&#21512;&#21462;&#23376;&#21477;&#65307;</li>
<li>&#24403;&#19988;&#20165;&#24403;&#20351;&#29992;<a href="cpp-language-constraints.html#.E4.B8.8D.E5.8F.AF.E5.88.86.E5.89.B2.E7.BA.A6.E6.9D.9F">&#19978;&#25991;</a>&#25152;&#36848;&#30340;&#35268;&#21017;&#21028;&#23450;&#20026;&#31561;&#21516;&#26102;&#65292;&#31216;&#19981;&#21487;&#20998;&#21106;&#32422;&#26463; <code>A</code> &#33021;&#24402;&#20837;&#19981;&#21487;&#20998;&#21106;&#32422;&#26463; <code>B</code>&#12290;</li>
</ul>
<p>&#24402;&#20837;&#20851;&#31995;&#23450;&#20041;&#20102;&#32422;&#26463;&#30340;&#20559;&#24207;&#65292;&#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;&#34892;&#20505;&#36873;</li>
<li>&#37325;&#36733;&#38598;&#20013;&#30340;<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>&#22914;&#26524;&#22768;&#26126; <code>D1</code> &#21644; <code>D2</code> &#22343;&#21463;&#32422;&#26463;&#65292;&#19988; <code>D1</code> &#20851;&#32852;&#30340;&#32422;&#26463;&#33021;&#24402;&#20837; <code>D2</code> &#20851;&#32852;&#30340;&#32422;&#26463;&#65292;&#65288;&#25110; <code>D2</code> &#27809;&#26377;&#32422;&#26463;&#65289;&#65292;&#37027;&#20040;&#31216; <code>D1</code> &#19982; <code>D2</code> &#30456;&#27604;<i>&#33267;&#23569;&#19968;&#26679;&#21463;&#32422;&#26463;</i>&#12290;&#22914;&#26524; <code>D1</code> &#33267;&#23569;&#19982; <code>D2</code> &#19968;&#26679;&#21463;&#32422;&#26463;&#65292;&#32780; <code>D2</code> &#24182;&#38750;&#33267;&#23569;&#19982; <code>D1</code> &#19968;&#26679;&#21463;&#32422;&#26463;&#65292;&#37027;&#20040; <code>D1</code> &#27604; <code>D2</code> <i>&#26356;&#21463;&#32422;&#26463;</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 &#33021;&#24402;&#20837; Decrementable&#65292;&#20294;&#21453;&#20043;&#19981;&#34892;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>Decrementable 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">// #1</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>RevIterator 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">// #2&#65292;&#27604; #1 &#26356;&#21463;&#32422;&#26463;</span>
f<span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// int &#21482;&#28385;&#36275; Decrementable&#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;&#20004;&#20010;&#32422;&#26463;&#65292;&#36873;&#25321; #2&#65292;&#22240;&#20026;&#23427;&#26356;&#21463;&#32422;&#26463;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
<span class="kw4">void</span> g<span class="br0">(</span>T<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #3&#65288;&#26080;&#32422;&#26463;&#65289;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>Decrementable T<span class="sy1">&gt;</span>
<span class="kw4">void</span> g<span class="br0">(</span>T<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&#65292;&#22240;&#20026;&#23427;&#26356;&#21463;&#32422;&#26463;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
concept RevIterator2 <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="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>Decrementable T<span class="sy1">&gt;</span>
<span class="kw4">void</span> h<span class="br0">(</span>T<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #5</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>RevIterator2 T<span class="sy1">&gt;</span>
<span class="kw4">void</span> h<span class="br0">(</span>T<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #6</span>
h<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">// &#26377;&#27495;&#20041;</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>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>