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

749 lines
122 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>&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;</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_template_argument_deduction skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading">&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;</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">
<p>&#20026;&#20102;&#23454;&#20363;&#21270;&#19968;&#20010;<a href="cpp-language-function_template.html">&#20989;&#25968;&#27169;&#26495;</a>&#65292;&#38656;&#35201;&#30693;&#26195;&#20294;&#19981;&#38656;&#35201;&#25351;&#23450;&#27599;&#20010;&#27169;&#26495;&#23454;&#21442;&#12290;&#32534;&#35793;&#22120;&#20250;&#23613;&#21487;&#33021;&#20174;&#20989;&#25968;&#23454;&#21442;&#25512;&#23548;&#32570;&#22833;&#30340;&#27169;&#26495;&#23454;&#21442;&#12290;&#36825;&#22312;&#23581;&#35797;&#35843;&#29992;&#20989;&#25968;&#12289;&#21462;&#20989;&#25968;&#27169;&#26495;&#22320;&#22336;&#26102;&#65292;&#21644;&#26576;&#20123;<a href="cpp-language-template_argument_deduction.html#.E5.85.B6.E4.BB.96.E8.AF.AD.E5.A2.83">&#20854;&#20182;&#35821;&#22659;</a>&#20013;&#21457;&#29983;&#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> To, <span class="kw1">typename</span> From<span class="sy1">&gt;</span> To convert<span class="br0">(</span>From f<span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">void</span> g<span class="br0">(</span><span class="kw4">double</span> d<span class="br0">)</span>
<span class="br0">{</span>
<span class="kw4">int</span> i <span class="sy1">=</span> convert<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span><span class="br0">(</span>d<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#35843;&#29992; convert&lt;int, double&gt;(double)</span>
<span class="kw4">char</span> c <span class="sy1">=</span> convert<span class="sy1">&lt;</span><span class="kw4">char</span><span class="sy1">&gt;</span><span class="br0">(</span>d<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#35843;&#29992; convert&lt;char, double&gt;(double)</span>
<span class="kw4">int</span><span class="br0">(</span><span class="sy2">*</span>ptr<span class="br0">)</span><span class="br0">(</span><span class="kw4">float</span><span class="br0">)</span> <span class="sy1">=</span> convert<span class="sy4">;</span> <span class="co1">// &#23454;&#20363;&#21270; convert&lt;int, float&gt;(float)</span>
<span class="co1">// &#24182;&#23558;&#23427;&#30340;&#22320;&#22336;&#20648;&#23384;&#22312; ptr</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#27169;&#26495;&#36816;&#31639;&#31526;&#20381;&#36182;&#27492;&#26426;&#21046;&#36816;&#34892;&#65292;&#22240;&#20026;&#38500;&#20102;&#23558;&#20854;&#37325;&#20889;&#20026;&#20989;&#25968;&#35843;&#29992;&#34920;&#36798;&#24335;&#20043;&#22806;&#65292;&#19981;&#23384;&#22312;&#20026;&#36816;&#31639;&#31526;&#25351;&#23450;&#27169;&#26495;&#23454;&#21442;&#30340;&#35821;&#27861;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Hello, world&quot;</span> <span class="sy1">&lt;&lt;</span> <a href="cpp-io-manip-endl.html"><span class="kw1791">std::<span class="me2">endl</span></span></a><span class="sy4">;</span>
<span class="co1">// operator&lt;&lt; &#36890;&#36807; ADL &#26597;&#25214;&#20026; std::operator&lt;&lt; &#65292;</span>
<span class="co1">// &#28982;&#21518;&#20004;&#27425;&#37117;&#25512;&#23548;&#20026; operator&lt;&lt;&lt;char, std::char_traits&lt;char&gt;&gt;</span>
<span class="co1">// std::endl &#34987;&#25512;&#23548;&#20026; &amp;std::endl&lt;char, std::char_traits&lt;char&gt;&gt;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#22312;&#20989;&#25968;&#27169;&#26495;<a href="cpp-language-lookup.html">&#21517;&#23383;&#26597;&#25214;</a>&#65288;&#21487;&#33021;&#28041;&#21450;<a href="cpp-language-adl.html">&#23454;&#21442;&#20381;&#36182;&#26597;&#25214;</a>&#65289;&#20043;&#21518;&#65292;&#22312;<a href="cpp-language-function_template.html#.E6.A8.A1.E6.9D.BF.E5.AE.9E.E5.8F.82.E6.9B.BF.E6.8D.A2">&#27169;&#26495;&#23454;&#21442;&#26367;&#25442;</a>&#65288;&#21487;&#33021;&#28041;&#21450; <a href="cpp-language-sfinae.html">SFINAE</a>&#65289;&#21644;<a href="cpp-language-overload_resolution.html">&#37325;&#36733;&#20915;&#35758;</a>&#20043;&#21069;&#36827;&#34892;&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx17">
<td>
<p>&#24403;&#23558;&#31867;&#27169;&#26495;&#21517;&#29992;&#20316;&#27491;&#22312;&#26500;&#36896;&#30340;&#23545;&#35937;&#30340;&#31867;&#22411;&#26102;&#65292;&#20063;&#20250;&#36827;&#34892;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#65306;</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> p<span class="br0">(</span><span class="nu0">2</span>, <span class="nu16">4.5</span><span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-utility-tuple.html"><span class="kw1098">std::<span class="me2">tuple</span></span></a> t<span class="br0">(</span><span class="nu0">4</span>, <span class="nu0">3</span>, <span class="nu16">2.5</span><span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-algorithm-copy_n.html"><span class="kw1584">std::<span class="me2">copy_n</span></span></a><span class="br0">(</span>vi1, <span class="nu0">3</span>, <a href="cpp-iterator-back_insert_iterator.html"><span class="kw660">std::<span class="me2">back_insert_iterator</span></span></a><span class="br0">(</span>vi2<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-algorithm-for_each.html"><span class="kw1568">std::<span class="me2">for_each</span></span></a><span class="br0">(</span>vi.<span class="me1">begin</span><span class="br0">(</span><span class="br0">)</span>, vi.<span class="me1">end</span><span class="br0">(</span><span class="br0">)</span>, Foo<span class="br0">(</span><span class="br0">[</span><span class="sy3">&amp;</span><span class="br0">]</span><span class="br0">(</span><span class="kw4">int</span> i<span class="br0">)</span> <span class="br0">{</span>...<span class="br0">}</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">auto</span> lck <span class="sy1">=</span> <a href="cpp-thread-lock_guard.html"><span class="kw2166">std::<span class="me2">lock_guard</span></span></a><span class="br0">(</span>foo.<span class="me1">mtx</span><span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-thread-lock_guard.html"><span class="kw2166">std::<span class="me2">lock_guard</span></span></a> lck2<span class="br0">(</span>foo.<span class="me1">mtx</span>, ul<span class="br0">)</span><span class="sy4">;</span></pre></div>
</div>
<p>&#31867;&#27169;&#26495;&#30340;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#22312;&#22768;&#26126;&#21644;&#26174;&#24335;&#36716;&#22411;&#34920;&#36798;&#24335;&#20013;&#21457;&#29983;&#65307;&#32454;&#33410;&#35265;<a href="cpp-language-class_template_argument_deduction.html">&#31867;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;</a>&#12290;</p>
</td>
<td><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></td>
</tr>
</table>
<h3><span class="mw-headline" id=".E4.BB.8E.E5.87.BD.E6.95.B0.E8.B0.83.E7.94.A8.E6.8E.A8.E5.AF.BC">&#20174;&#20989;&#25968;&#35843;&#29992;&#25512;&#23548;</span></h3>
<p>&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#35797;&#22270;&#30830;&#23450;&#27169;&#26495;&#23454;&#21442;&#65288;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442; <code><b>T</b></code>i &#30340;&#31867;&#22411;&#65292;&#27169;&#26495;&#27169;&#26495;&#24418;&#21442; <code><b>TT</b></code>i &#30340;&#27169;&#26495;&#65292;&#21644;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442; <code><b>I</b></code>i &#30340;&#20540;&#65289;&#65292;&#23427;&#20204;&#22312;&#32463;&#36807;&#20197;&#19979;&#21015;&#20986;&#30340;&#35843;&#25972;&#20043;&#21518;&#21487;&#20197;&#26367;&#25442;&#21040;&#27599;&#20010;&#20989;&#25968;&#24418;&#21442; <code><b>P</b></code> &#20013;&#65292;&#20197;&#20135;&#29983;<i>&#25512;&#23548;</i>&#30340;&#31867;&#22411; <code><b>A</b></code>&#65292;&#23427;&#19982;&#20989;&#25968;&#23454;&#21442; <code><b>A</b></code> &#31867;&#22411;&#30456;&#21516;&#12290;</p>
<p>&#22914;&#26524;&#26377;&#22810;&#20010;&#24418;&#21442;&#65292;&#37027;&#20040;&#20998;&#21035;&#25512;&#23548;&#27599;&#19968;&#23545; <code><b>P</b></code>/<code><b>A</b></code>&#65292;&#28982;&#21518;&#21512;&#24182;&#27169;&#26495;&#23454;&#21442;&#12290;&#22914;&#26524;&#20219;&#20309;&#19968;&#23545; <code><b>P</b></code>/<code><b>A</b></code> &#30340;&#25512;&#23548;&#22833;&#36133;&#25110;&#26377;&#27495;&#20041;&#65292;&#25110;&#22914;&#26524;&#19981;&#21516;&#23545;&#25512;&#23548;&#20986;&#30340;&#27169;&#26495;&#23454;&#21442;&#19981;&#21516;&#65292;&#25110;&#22914;&#26524;&#36824;&#26377;&#20219;&#20309;&#27169;&#26495;&#23454;&#21442;&#20445;&#30041;&#36824;&#26159;&#27809;&#26377;&#34987;&#25512;&#23548;&#19988;&#27809;&#26377;&#34987;&#26174;&#24335;&#25351;&#23450;&#65292;&#37027;&#20040;&#32534;&#35793;&#22833;&#36133;&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx11">
<td>
<p>&#22914;&#26524; <code><b>P</b></code> &#22312;&#31227;&#38500;&#24341;&#29992;&#21644; cv &#38480;&#23450;&#31526;&#21518;&#24471;&#21040; <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-initializer_list.html"><span class="kw960">std::<span class="me2">initializer_list</span></span></a><span class="sy1">&lt;</span>P<span class="st0">&#39;&gt;</span></span></span> &#19988; <code><b>A</b></code> &#26159;<a href="cpp-language-list_initialization.html">&#33457;&#25324;&#21495;&#21021;&#22987;&#21270;&#22120;&#21015;&#34920;</a>&#65292;&#37027;&#20040;&#23545;&#35813;&#21021;&#22987;&#21270;&#22120;&#21015;&#34920;&#20013;&#30340;&#27599;&#20010;&#20803;&#32032;&#36827;&#34892;&#25512;&#23548;&#65292;&#20197; <code><b>P&#39;</b></code> &#20026;&#24418;&#21442;&#65292;&#24182;&#20197;&#21015;&#34920;&#20803;&#32032; <code><b>A&#39;</b></code> &#20026;&#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="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span><a href="cpp-utility-initializer_list.html"><span class="kw960">std::<span class="me2">initializer_list</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">)</span><span class="sy4">;</span>
f<span class="br0">(</span><span class="br0">{</span><span class="nu0">1</span>, <span class="nu0">2</span>, <span class="nu0">3</span><span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = std::initializer_list&lt;T&gt;, A = {1, 2, 3}</span>
<span class="co1">// P&#39;1 = T&#65292;A&#39;1 = 1&#65306;&#25512;&#23548;&#20986; T = int</span>
<span class="co1">// P&#39;2 = T&#65292;A&#39;2 = 2&#65306;&#25512;&#23548;&#20986; T = int</span>
<span class="co1">// P&#39;3 = T&#65292;A&#39;3 = 3&#65306;&#25512;&#23548;&#20986; T = int</span>
<span class="co1">// OK&#65306;&#25512;&#23548;&#20986; T = int</span>
f<span class="br0">(</span><span class="br0">{</span><span class="nu0">1</span>, <span class="st0">&quot;abc&quot;</span><span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = std::initializer_list&lt;T&gt;&#65292;A = {1, &quot;abc&quot;}</span>
<span class="co1">// P&#39;1 = T&#65292;A&#39;1 = 1&#65306;&#25512;&#23548;&#20986; T = int</span>
<span class="co1">// P&#39;2 = T&#65292;A&#39;2 = &quot;abc&quot;&#65306;&#25512;&#23548;&#20986; T = const char*</span>
<span class="co1">// &#38169;&#35823;&#65306;&#25512;&#23548;&#22833;&#36133;&#65292;T &#26377;&#27495;&#20041;</span></pre></div>
</div>
<p>&#22914;&#26524; <code><b>P</b></code> &#22312;&#31227;&#38500;&#24341;&#29992;&#21644; cv &#38480;&#23450;&#31526;&#21518;&#24471;&#21040; <code><b>P&#39;</b></code>[<code>N</code>] &#19988; <code><b>A</b></code> &#26159;&#38750;&#31354;&#33457;&#25324;&#21495;&#21021;&#22987;&#21270;&#22120;&#21015;&#34920;&#65292;&#37027;&#20040;&#25353;&#19978;&#36848;&#26041;&#27861;&#36827;&#34892;&#25512;&#23548;&#65292;&#20294;&#22914;&#26524; <code>N</code> &#26159;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#65292;&#37027;&#20040;&#23427;&#20250;&#20174;&#21021;&#22987;&#21270;&#22120;&#21015;&#34920;&#30340;&#38271;&#24230;&#34987;&#25512;&#23548;&#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="kw4">int</span> N<span class="sy1">&gt;</span> <span class="kw4">void</span> h<span class="br0">(</span>T <span class="kw4">const</span><span class="br0">(</span><span class="sy3">&amp;</span><span class="br0">)</span><span class="br0">[</span>N<span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span>
h<span class="br0">(</span><span class="br0">{</span><span class="nu0">1</span>, <span class="nu0">2</span>, <span class="nu0">3</span><span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#25512;&#23548;&#20986; T = int &#20197;&#21450; N = 3</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> j<span class="br0">(</span>T <span class="kw4">const</span><span class="br0">(</span><span class="sy3">&amp;</span><span class="br0">)</span><span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span>
j<span class="br0">(</span><span class="br0">{</span><span class="nu0">42</span><span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#25512;&#23548;&#20986; T = int&#65292;&#25968;&#32452;&#36793;&#30028;&#19981;&#26159;&#24418;&#21442;&#65292;&#19981;&#32771;&#34385;</span>
<span class="kw1">struct</span> Aggr <span class="br0">{</span> <span class="kw4">int</span> i<span class="sy4">;</span> <span class="kw4">int</span> j<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span> N<span class="sy1">&gt;</span> <span class="kw4">void</span> k<span class="br0">(</span>Aggr <span class="kw4">const</span><span class="br0">(</span><span class="sy3">&amp;</span><span class="br0">)</span><span class="br0">[</span>N<span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span>
k<span class="br0">(</span><span class="br0">{</span><span class="nu0">1</span>, <span class="nu0">2</span>, <span class="nu0">3</span><span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#25512;&#23548;&#22833;&#36133;&#65292;&#27809;&#26377;&#20174; int &#21040; Aggr &#30340;&#36716;&#25442;</span>
k<span class="br0">(</span><span class="br0">{</span><span class="br0">{</span><span class="nu0">1</span><span class="br0">}</span>, <span class="br0">{</span><span class="nu0">2</span><span class="br0">}</span>, <span class="br0">{</span><span class="nu0">3</span><span class="br0">}</span><span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#25512;&#23548;&#20986; N = 3</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span> M, <span class="kw4">int</span> N<span class="sy1">&gt;</span> <span class="kw4">void</span> m<span class="br0">(</span><span class="kw4">int</span> <span class="kw4">const</span><span class="br0">(</span><span class="sy3">&amp;</span><span class="br0">)</span><span class="br0">[</span>M<span class="br0">]</span><span class="br0">[</span>N<span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span>
m<span class="br0">(</span><span class="br0">{</span><span class="br0">{</span><span class="nu0">1</span>, <span class="nu0">2</span><span class="br0">}</span>, <span class="br0">{</span><span class="nu0">3</span>, <span class="nu0">4</span><span class="br0">}</span><span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#25512;&#23548;&#20986; M = 2 &#20197;&#21450; N = 2</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T, <span class="kw4">int</span> N<span class="sy1">&gt;</span> <span class="kw4">void</span> n<span class="br0">(</span>T <span class="kw4">const</span><span class="br0">(</span><span class="sy3">&amp;</span><span class="br0">)</span><span class="br0">[</span>N<span class="br0">]</span>, T<span class="br0">)</span><span class="sy4">;</span>
n<span class="br0">(</span><span class="br0">{</span><span class="br0">{</span><span class="nu0">1</span><span class="br0">}</span>, <span class="br0">{</span><span class="nu0">2</span><span class="br0">}</span>, <span class="br0">{</span><span class="nu0">3</span><span class="br0">}</span><span class="br0">}</span>, Aggr<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#25512;&#23548;&#20986; T = Aggr &#20197;&#21450; N = 3</span></pre></div>
</div>
<p>&#22914;&#26524;<a href="cpp-language-parameter_pack.html">&#24418;&#21442;&#21253;</a>&#20316;&#20026;&#26368;&#21518;&#30340; <code><b>P</b></code> &#20986;&#29616;&#65292;&#37027;&#20040;&#23545;&#35843;&#29992;&#30340;&#27599;&#20010;&#21097;&#20313;&#23454;&#21442;&#31867;&#22411; <code><b>A</b></code> &#19982;&#31867;&#22411; <code><b>P</b></code> &#21305;&#37197;&#12290;&#27599;&#20010;&#21305;&#37197;&#20026;&#21253;&#23637;&#24320;&#20013;&#30340;&#19979;&#20010;&#20301;&#32622;&#25512;&#23548;&#27169;&#26495;&#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>... <span class="me1">Types</span><span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span>Types<span class="sy3">&amp;</span>...<span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">void</span> h<span class="br0">(</span><span class="kw4">int</span> x, <span class="kw4">float</span><span class="sy3">&amp;</span> y<span class="br0">)</span>
<span class="br0">{</span>
<span class="kw4">const</span> <span class="kw4">int</span> z <span class="sy1">=</span> x<span class="sy4">;</span>
f<span class="br0">(</span>x, y, z<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = Types&amp;..., A1 = x&#65306;&#25512;&#23548;&#20986; Types... &#30340;&#31532;&#19968;&#25104;&#21592; = int</span>
<span class="co1">// P = Types&amp;..., A2 = y&#65306;&#25512;&#23548;&#20986; Types... &#30340;&#31532;&#20108;&#25104;&#21592; = float</span>
<span class="co1">// P = Types&amp;..., A3 = z&#65306;&#25512;&#23548;&#20986; Types... &#30340;&#31532;&#19977;&#25104;&#21592; = const int</span>
<span class="co1">// &#35843;&#29992; f&lt;int, float, const int&gt;</span>
<span class="br0">}</span></pre></div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
</table>
<p>&#22914;&#26524; <code><b>P</b></code> &#26159;&#20989;&#25968;&#31867;&#22411;&#12289;&#20989;&#25968;&#25351;&#38024;&#31867;&#22411;&#25110;&#25104;&#21592;&#20989;&#25968;&#25351;&#38024;&#31867;&#22411;&#19988; <code><b>A</b></code> &#26159;&#19981;&#21547;&#20989;&#25968;&#27169;&#26495;&#30340;<a href="cpp-language-overloaded_address.html">&#37325;&#36733;&#20989;&#25968;&#38598;</a>&#65292;&#37027;&#20040;&#23581;&#35797;&#20197;&#27599;&#20010;&#37325;&#36733;&#25512;&#23548;&#21508;&#27169;&#26495;&#23454;&#21442;&#12290;&#22914;&#26524;&#21482;&#26377;&#19968;&#20010;&#25104;&#21151;&#65292;&#37027;&#20040;&#20351;&#29992;&#25104;&#21151;&#30340;&#25512;&#23548;&#12290;&#22914;&#26524;&#27809;&#26377;&#25110;&#26377;&#22810;&#20010;&#25104;&#21151;&#65292;&#37027;&#20040;&#27169;&#26495;&#24418;&#21442;&#26159;&#19981;&#25512;&#23548;&#35821;&#22659;&#65288;&#35265;&#19979;&#25991;&#65289;&#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> <span class="kw4">int</span> f<span class="br0">(</span>T<span class="br0">(</span><span class="sy2">*</span>p<span class="br0">)</span><span class="br0">(</span>T<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">int</span> g<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">int</span> g<span class="br0">(</span><span class="kw4">char</span><span class="br0">)</span><span class="sy4">;</span>
f<span class="br0">(</span>g<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = T(*)(T)&#65292;A = &#37325;&#36733;&#38598;</span>
<span class="co1">// P = T(*)(T)&#65292;A1 = int(int)&#65306;&#25512;&#23548;&#20986; T = int</span>
<span class="co1">// P = T(*)(T)&#65292;A2 = int(char)&#65306;&#26080;&#27861;&#25512;&#23548;&#20986; T</span>
<span class="co1">// &#21482;&#26377;&#19968;&#20010;&#37325;&#36733;&#26377;&#25928;&#65292;&#25512;&#23548;&#25104;&#21151;</span></pre></div>
</div>
<p>&#25512;&#23548;&#24320;&#22987;&#21069;&#65292;&#23545; <code><b>P</b></code> &#21644; <code><b>A</b></code> &#36827;&#34892;&#19979;&#21015;&#35843;&#25972;&#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> &#22914;&#26524; <code><b>P</b></code> &#19981;&#26159;&#24341;&#29992;&#31867;&#22411;&#65292;</div>
<div class="t-li2"><span class="t-li">a)</span> &#22914;&#26524; <code><b>A</b></code> &#26159;&#25968;&#32452;&#31867;&#22411;&#65292;&#37027;&#20040;&#20197;&#20174;&#25968;&#32452;&#21040;&#25351;&#38024;&#36716;&#25442;&#33719;&#24471;&#30340;&#25351;&#38024;&#31867;&#22411;&#26367;&#25442; <code><b>A</b></code>&#65307;</div>
<div class="t-li2"><span class="t-li">b)</span> &#21542;&#21017;&#65292;&#22914;&#26524; <code><b>A</b></code> &#26159;&#20989;&#25968;&#31867;&#22411;&#65292;&#37027;&#20040;&#20197;&#20174;&#20989;&#25968;&#21040;&#25351;&#38024;&#36716;&#25442;&#33719;&#24471;&#30340;&#25351;&#38024;&#31867;&#22411;&#26367;&#25442; <code><b>A</b></code>&#65307;</div>
<div class="t-li2"><span class="t-li">c)</span> &#21542;&#21017;&#65292;&#22914;&#26524; <code><b>A</b></code> &#26159;&#26377; cv &#38480;&#23450;&#30340;&#31867;&#22411;&#65292;&#37027;&#20040;&#25512;&#23548;&#26102;&#20250;&#24573;&#30053;&#39030;&#23618; cv &#38480;&#23450;&#31526;&#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">class</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="kw4">int</span> a<span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span><span class="sy4">;</span>
f<span class="br0">(</span>a<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = T&#65292;A = int[3]&#65292;&#35843;&#25972;&#20026; int*&#65306;&#25512;&#23548;&#20986; T = int*</span>
<span class="kw4">void</span> b<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span>
f<span class="br0">(</span>b<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = T&#65292;A = void(int)&#65292;&#35843;&#25972;&#20026; void(*)(int)&#65306;&#25512;&#23548;&#20986; T = void(*)(int)</span>
<span class="kw4">const</span> <span class="kw4">int</span> c <span class="sy1">=</span> <span class="nu0">13</span><span class="sy4">;</span>
f<span class="br0">(</span>c<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = T&#65292;A = const int&#65292;&#35843;&#25972;&#20026; int&#65306;&#25512;&#23548;&#20986; T = int</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">2)</span> &#22914;&#26524; <code><b>P</b></code> &#26159;&#26377; cv &#38480;&#23450;&#30340;&#31867;&#22411;&#65292;&#37027;&#20040;&#25512;&#23548;&#26102;&#20250;&#24573;&#30053;&#39030;&#23618; cv &#38480;&#23450;&#31526;&#12290;</div>
<div class="t-li1"><span class="t-li">3)</span> &#22914;&#26524; <code><b>P</b></code> &#26159;&#24341;&#29992;&#31867;&#22411;&#65292;&#37027;&#20040;&#29992; <code><b>P</b></code> &#25152;&#24341;&#29992;&#30340;&#31867;&#22411;&#25512;&#23548;&#12290;</div>
<div class="t-li1"><span class="t-li">4)</span> &#22914;&#26524; <code><b>P</b></code> &#26159;&#21040;&#26080; cv &#38480;&#23450;&#27169;&#26495;&#24418;&#21442;&#30340;&#21491;&#20540;&#24341;&#29992;&#65288;&#20063;&#23601;&#26159;<a href="cpp-language-reference.html#.E8.BD.AC.E5.8F.91.E5.BC.95.E7.94.A8">&#36716;&#21457;&#24341;&#29992;</a>&#65289;&#19988;&#23545;&#24212;&#20989;&#25968;&#30340;&#35843;&#29992;&#23454;&#21442;&#26159;&#24038;&#20540;&#65292;&#37027;&#20040;&#23558;&#21040; <code><b>A</b></code> &#30340;&#24038;&#20540;&#24341;&#29992;&#31867;&#22411;&#29992;&#20110; <code><b>A</b></code> &#30340;&#20301;&#32622;&#36827;&#34892;&#25512;&#23548;&#65288;&#27880;&#24847;&#65306;&#36825;&#26159; <span class="t-lc"><a href="cpp-utility-forward.html">std::forward</a></span> &#30340;&#34892;&#21160;&#22522;&#30784;&#65307;<span class="t-rev-inl t-since-cxx17"><span>&#27880;&#24847;&#65306;<a href="cpp-language-class_template_argument_deduction.html">&#31867;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;</a>&#20013;&#65292;&#31867;&#27169;&#26495;&#30340;&#27169;&#26495;&#24418;&#21442;&#19981;&#21487;&#33021;&#26159;&#36716;&#21457;&#24341;&#29992;</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></span></span>&#12290;&#65289;&#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">class</span> T<span class="sy1">&gt;</span>
<span class="kw4">int</span> f<span class="br0">(</span>T<span class="sy3">&amp;&amp;</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P &#26159;&#21040;&#26080; cv &#38480;&#23450;&#31867;&#22411; T &#30340;&#21491;&#20540;&#24341;&#29992;&#65288;&#36716;&#21457;&#24341;&#29992;&#65289;</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">int</span> g<span class="br0">(</span><span class="kw4">const</span> T<span class="sy3">&amp;&amp;</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P &#26159;&#21040;&#26377; cv &#38480;&#23450; T &#30340;&#21491;&#20540;&#24341;&#29992;&#65288;&#38750;&#29305;&#27530;&#65289;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="kw4">int</span> i<span class="sy4">;</span>
<span class="kw4">int</span> n1 <span class="sy1">=</span> f<span class="br0">(</span>i<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#23454;&#21442;&#26159;&#24038;&#20540;&#65306; &#35843;&#29992; f&lt;int&amp;&gt;(int&amp;) &#65288;&#29305;&#27530;&#24773;&#20917;&#65289;</span>
<span class="kw4">int</span> n2 <span class="sy1">=</span> f<span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#23454;&#21442;&#19981;&#26159;&#24038;&#20540;&#65306;&#35843;&#29992; f&lt;int&gt;(int&amp;&amp;)</span>
<span class="co1">// int n3 = g(i); // &#38169;&#35823;&#65306;&#25512;&#23548;&#20986; g&lt;int&gt;(const int&amp;&amp;)&#65292;&#23427;&#19981;&#33021;&#32465;&#23450;&#21491;&#20540;&#24341;&#29992;&#21040;&#24038;&#20540;</span>
<span class="br0">}</span></pre></div>
</div>
</div>
<p>&#22312;&#36827;&#34892;&#36825;&#20123;&#21464;&#25442;&#20043;&#21518;&#65292;&#25353;&#20197;&#19979;&#27493;&#39588;&#36827;&#34892;&#25512;&#23548;&#22788;&#29702;&#65288;&#21442;&#38405;&ldquo;&#20174;&#31867;&#22411;&#25512;&#23548;&rdquo;&#19968;&#33410;&#65289;&#24182;&#35797;&#22270;&#25214;&#21040;&#33021;&#35753;&#25512;&#23548;&#30340; <code><b>A</b></code>&#65288;&#21363;&#22312;&#19978;&#38754;&#21015;&#20986;&#30340;&#35843;&#25972;&#21644;&#25512;&#23548;&#30340;&#27169;&#26495;&#24418;&#21442;&#26367;&#25442;&#21518;&#30340; <code><b>P</b></code>&#65289;&#31561;&#21516;&#20110;<i>&#21464;&#25442;</i>&#21518;&#30340; <code><b>A</b></code>&#65288;&#21363;&#19978;&#38754;&#21015;&#20986;&#30340;&#35843;&#25972;&#21518;&#30340; <code><b>A</b></code>&#65289;&#30340;&#27169;&#26495;&#23454;&#21442;&#12290;</p>
<p>&#22914;&#26524;&#26469;&#33258; <code><b>P</b></code> &#21644; <code><b>A</b></code> &#30340;&#36890;&#24120;&#25512;&#23548;&#22833;&#36133;&#65292;&#37027;&#20040;&#39069;&#22806;&#32771;&#34385;&#19979;&#21015;&#26367;&#29992;&#32773;&#65306;</p>
<div class="t-li1"><span class="t-li">1)</span> &#22914;&#26524; <code><b>P</b></code> &#26159;&#24341;&#29992;&#31867;&#22411;&#65292;&#37027;&#20040;&#25512;&#23548;&#30340; <code><b>A</b></code>&#65288;&#21363;&#24341;&#29992;&#25152;&#25351;&#28041;&#30340;&#31867;&#22411;&#65289;&#33021;&#27604;&#21464;&#25442;&#30340; <code><b>A</b></code> &#26377;&#26356;&#22810;&#30340; cv &#38480;&#23450;&#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> <span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">const</span> T<span class="sy3">&amp;</span> t<span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">bool</span> a <span class="sy1">=</span> <span class="kw2">false</span><span class="sy4">;</span>
f<span class="br0">(</span>a<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = const T&amp;&#65292;&#35843;&#25972;&#20026; const T&#65292;A = bool&#65306;</span>
<span class="co1">// &#25512;&#23548;&#20986; T = bool &#20197;&#21450; A = const bool</span>
<span class="co1">// &#25512;&#23548;&#20986;&#30340; A &#27604;&#65288;&#21407;&#26469;&#30340;&#65289;A &#26377;&#26356;&#22810;&#30340; cv &#38480;&#23450;</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">2)</span> &#21464;&#25442;&#21518;&#30340; <code><b>A</b></code> &#21487;&#20197;&#20855;&#26377;&#21478;&#19968;&#25351;&#38024;&#25110;&#25104;&#21592;&#25351;&#38024;&#31867;&#22411;&#65292;&#24182;&#21487;&#20197;&#36890;&#36807;<a href="cpp-language-implicit_conversion.html#.E9.99.90.E5.AE.9A.E8.BD.AC.E6.8D.A2">&#38480;&#23450;&#36716;&#25442;</a><span class="t-rev-inl t-since-cxx17"><span>&#25110;&#20989;&#25968;&#25351;&#38024;&#36716;&#25442;</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></span></span>&#36716;&#25442;&#21040;&#25512;&#23548;&#20986;&#30340; <code><b>A</b></code>&#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> <span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">const</span> T<span class="sy2">*</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">int</span><span class="sy2">*</span> p<span class="sy4">;</span>
f<span class="br0">(</span>p<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = const T*&#65292;A = int*&#65306;</span>
<span class="co1">// &#25512;&#23548; T = int &#20197;&#21450; A = const int*</span>
<span class="co1">// &#24212;&#29992;&#38480;&#23450;&#36716;&#25442;&#65288;&#20174; int* &#21040; const int*&#65289;</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">3)</span> &#22914;&#26524; <code><b>P</b></code> &#26159;&#31867;&#19988; <code><b>P</b></code> &#30340;&#24418;&#24335;&#20026; <i><a href="cpp-language-templates.html#.E6.A8.A1.E6.9D.BF.E6.A0.87.E8.AF.86">&#31616;&#21333;&#27169;&#26495;&#26631;&#35782;</a></i>&#65292;&#37027;&#20040;&#21464;&#25442;&#21518;&#30340; <code><b>A</b></code> &#21487;&#20197;&#26159;&#25512;&#23548;&#20986;&#30340; <code><b>A</b></code> &#30340;&#27966;&#29983;&#31867;&#12290;&#31867;&#20284;&#22320;&#65292;&#22914;&#26524; <code><b>P</b></code> &#26159;&#25351;&#21521; <i>&#31616;&#21333;&#27169;&#26495;&#26631;&#35782;</i> &#24418;&#24335;&#30340;&#31867;&#30340;&#25351;&#38024;&#65292;&#37027;&#20040;&#21464;&#25442;&#21518;&#30340; <code><b>A</b></code> &#21487;&#20197;&#26159;&#25512;&#23548;&#20986;&#30340; <code><b>A</b></code> &#25152;&#25351;&#21521;&#30340;&#27966;&#29983;&#31867;&#30340;&#25351;&#38024;&#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">class</span> T<span class="sy1">&gt;</span> <span class="kw1">struct</span> B <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">class</span> T<span class="sy1">&gt;</span> <span class="kw1">struct</span> D <span class="sy4">:</span> <span class="kw1">public</span> B<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="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>B<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy3">&amp;</span><span class="br0">)</span> <span class="br0">{</span> <span class="br0">}</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
D<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> d<span class="sy4">;</span>
f<span class="br0">(</span>d<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = B&lt;T&gt;&amp;&#65292;&#35843;&#25972;&#20026; P = B&lt;T&gt;&#65288;&#31616;&#21333;&#27169;&#26495;&#26631;&#35782;&#65289;&#65292;A = D&lt;int&gt;&#65306;</span>
<span class="co1">// &#25512;&#23548;&#20986; T = int &#20197;&#21450; A = B&lt;int&gt;</span>
<span class="co1">// &#65288;&#21407;&#26469;&#30340;&#65289;A &#27966;&#29983;&#33258;&#25512;&#23548;&#20986;&#30340; A </span>
<span class="br0">}</span></pre></div>
</div>
</div>
<h4><span class="mw-headline" id=".E4.B8.8D.E6.8E.A8.E5.AF.BC.E8.AF.AD.E5.A2.83">&#19981;&#25512;&#23548;&#35821;&#22659;</span></h4>
<p>&#19979;&#21015;&#24773;&#20917;&#19979;&#65292;&#29992;&#26469;&#32452;&#25104; <code><b>P</b></code> &#30340;&#31867;&#22411;&#12289;&#27169;&#26495;&#21644;&#38750;&#31867;&#22411;&#20540;&#19981;&#20250;&#21442;&#19982;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#65292;&#32780;&#25913;&#20026;<i>&#20351;&#29992;</i>&#21487;&#20197;&#22312;&#21035;&#22788;&#25512;&#23548;&#20986;&#25110;&#26174;&#24335;&#25351;&#23450;&#30340;&#27169;&#26495;&#23454;&#21442;&#12290;&#22914;&#26524;&#27169;&#26495;&#24418;&#21442;&#21482;&#22312;&#19981;&#25512;&#23548;&#35821;&#22659;&#20351;&#29992;&#19988;&#27809;&#26377;&#34987;&#26174;&#24335;&#25351;&#23450;&#65292;&#37027;&#20040;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#22833;&#36133;&#12290;</p>
<div class="t-li1"><span class="t-li">1)</span> &#29992;<a href="cpp-language-identifiers.html#.E6.9C.89.E9.99.90.E5.AE.9A.E7.9A.84.E6.A0.87.E8.AF.86.E7.AC.A6">&#26377;&#38480;&#23450;&#26631;&#35782;</a>&#25351;&#23450;&#30340;&#31867;&#22411;&#30340; <span class="t-spar">&#23884;&#22871;&#21517;&#35828;&#26126;&#31526;</span>&#65288;&#20316;&#29992;&#22495;&#35299;&#26512;&#36816;&#31639;&#31526; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy4">::</span></span></span> &#24038;&#20391;&#30340;&#25152;&#26377;&#20869;&#23481;&#65289;&#65306;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co1">// &#24658;&#31561;&#27169;&#26495;&#65292;&#24120;&#29992;&#20110;&#20174;&#25512;&#23548;&#20013;&#25490;&#38500;&#29305;&#23450;&#23454;&#21442;</span>
<span class="co1">// &#65288;&#21363; C++20 &#20013;&#26032;&#22686;&#30340; std::type_identity &#65289;</span>
<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> identity <span class="br0">{</span> <span class="kw1">typedef</span> T type<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> <span class="kw4">void</span> bad<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>T<span class="sy1">&gt;</span> x, T value <span class="sy1">=</span> <span class="nu0">1</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> <span class="kw4">void</span> good<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>T<span class="sy1">&gt;</span> x, <span class="kw1">typename</span> identity<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">type</span> value <span class="sy1">=</span> <span class="nu0">1</span><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><a href="cpp-numeric-complex.html"><span class="kw1472">std::<span class="me2">complex</span></span></a><span class="sy1">&lt;</span><span class="kw4">double</span><span class="sy1">&gt;&gt;</span> x<span class="sy4">;</span>
bad<span class="br0">(</span>x, <span class="nu16">1.2</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P1 = std::vector&lt;T&gt;&#65292;A1 = std::vector&lt;std::complex&lt;double&gt;&gt;</span>
<span class="co1">// P1/A1&#65306;&#25512;&#23548;&#20986; T = std::complex&lt;double&gt;</span>
<span class="co1">// P2 = T&#65292;A2 = double</span>
<span class="co1">// P2/A2&#65306;&#25512;&#23548;&#20986; T = double</span>
<span class="co1">// &#38169;&#35823;&#65306;&#25512;&#23548;&#22833;&#36133;&#65292;T &#26377;&#27495;&#20041;</span>
good<span class="br0">(</span>x, <span class="nu16">1.2</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P1 = std::vector&lt;T&gt;&#65292;A1 = std::vector&lt;std::complex&lt;double&gt;&gt;</span>
<span class="co1">// P1/A1&#65306;&#25512;&#23548;&#20986; T = std::complex&lt;double&gt;</span>
<span class="co1">// P2 = identity&lt;T&gt;::type&#65292;A2 = double</span>
<span class="co1">// P2/A2&#65306;&#20351;&#29992; P1/A1 &#25512;&#23548;&#20986;&#30340; T&#65292;&#22240;&#20026; T &#22312; P2 &#20013;&#30340; :: &#30340;&#24038;&#20391;</span>
<span class="co1">// OK&#65306;T = std::complex&lt;double&gt;</span></pre></div>
</div>
</div>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx11">
<td>
<div class="t-li1"><span class="t-li">2)</span> <a href="cpp-language-decltype.html">decltype</a> &#35828;&#26126;&#31526;&#30340;&#34920;&#36798;&#24335;&#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> <span class="kw4">void</span> f<span class="br0">(</span>decltype<span class="br0">(</span><span class="sy2">*</span><a href="cpp-utility-declval.html"><span class="kw1120">std::<span class="me2">declval</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> arg<span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">int</span> n<span class="sy4">;</span>
f<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy2">*</span><span class="sy1">&gt;</span><span class="br0">(</span>n<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = decltype(*declval&lt;T&gt;())&#65292;A = int&#65306;T &#22788;&#20110;&#19981;&#25512;&#23548;&#35821;&#22659;</span></pre></div>
</div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
</table>
<div class="t-li1"><span class="t-li">3)</span> &#38750;&#31867;&#22411;&#27169;&#26495;&#23454;&#21442;&#25110;&#25968;&#32452;&#36793;&#30028;&#65292;&#20854;&#20013;&#23376;&#34920;&#36798;&#24335;&#24341;&#29992;&#19968;&#20010;&#27169;&#26495;&#24418;&#21442;&#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><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> N<span class="sy1">&gt;</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">int</span>, <span class="nu0">2</span> <span class="sy2">*</span> N<span class="sy1">&gt;</span> a<span class="br0">)</span><span class="sy4">;</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">int</span>, <span class="nu0">10</span><span class="sy1">&gt;</span> a<span class="sy4">;</span>
f<span class="br0">(</span>a<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = std::array&lt;int, 2 * N&gt;&#65292;A = std::array&lt;int, 10&gt;&#65306;</span>
<span class="co1">// 2 * N &#22788;&#20110;&#19981;&#25512;&#23548;&#35821;&#22659;&#65292;&#26080;&#27861;&#25512;&#23548;&#20986; N</span>
<span class="co1">// &#27880;&#24847;&#65306;f(std::array&lt;int, N&gt; a) &#21487;&#20197;&#25512;&#23548;&#20986; N</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">4)</span> &#29992;&#20110;&#20989;&#25968;&#24418;&#21442;&#30340;&#24418;&#21442;&#31867;&#22411;&#20013;&#25317;&#26377;&#40664;&#35748;&#23454;&#21442;&#30340;&#27169;&#26495;&#24418;&#21442;&#65292;&#19988;&#35813;&#20989;&#25968;&#24418;&#21442;&#22312;&#27491;&#22312;&#36827;&#34892;&#23454;&#21442;&#25512;&#23548;&#30340;&#35843;&#29992;&#20013;&#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="kw1">typename</span> F<span class="sy1">&gt;</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">const</span> <a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy3">&amp;</span> v, <span class="kw4">const</span> F<span class="sy3">&amp;</span> comp <span class="sy1">=</span> <a href="cpp-utility-functional-less.html"><span class="kw1039">std::<span class="me2">less</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><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><a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a><span class="sy1">&gt;</span> v<span class="br0">(</span><span class="nu0">3</span><span class="br0">)</span><span class="sy4">;</span>
f<span class="br0">(</span>v<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P1 = const std::vector&lt;T&gt;&amp;&#65292;A1 = std::vector&lt;std::string&gt; &#24038;&#20540;</span>
<span class="co1">// P1/A1 &#25512;&#23548;&#20986; T = std::string</span>
<span class="co1">// P2 = const F&amp;&#65292;A2 = std::less&lt;std::string&gt; &#21491;&#20540;</span>
<span class="co1">// P2 &#22312;&#29992;&#20110;&#20989;&#25968;&#24418;&#21442; comp &#30340;&#24418;&#21442;&#31867;&#22411;&#65288;const F&amp;&#65289;&#30340; F&#65288;&#27169;&#26495;&#24418;&#21442;&#65289;&#30340;&#19981;&#25512;&#23548;&#35821;&#22659;&#65292;</span>
<span class="co1">// &#35813;&#20989;&#25968;&#24418;&#21442;&#25317;&#26377;&#35843;&#29992; f(v) &#20013;&#27491;&#22312;&#20351;&#29992;&#30340;&#40664;&#35748;&#23454;&#21442;</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">5)</span> &#24418;&#21442; <code><b>P</b></code>&#65292;&#20854;&#23454;&#21442; <code><b>A</b></code> &#26159;&#19968;&#20010;&#20989;&#25968;&#65292;&#27809;&#26377;&#20989;&#25968;&#25110;&#26377;&#22810;&#20010;&#20989;&#25968;&#19982; <code><b>P</b></code> &#21305;&#37197;&#30340;&#37325;&#36733;&#38598;&#65292;&#25110;&#21253;&#21547;&#19968;&#20010;&#25110;&#22810;&#20010;&#20989;&#25968;&#27169;&#26495;&#30340;&#37325;&#36733;&#38598;&#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> <span class="kw4">void</span> out<span class="br0">(</span><span class="kw4">const</span> T<span class="sy3">&amp;</span> value<span class="br0">)</span> <span class="br0">{</span> <a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> value<span class="sy4">;</span> <span class="br0">}</span>
out<span class="br0">(</span><span class="st0">&quot;123&quot;</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = const T&amp;&#65292;A = const char[4] &#24038;&#20540;&#65306;&#25512;&#23548;&#20986; T = char[4]</span>
out<span class="br0">(</span><a href="cpp-io-manip-endl.html"><span class="kw1791">std::<span class="me2">endl</span></span></a><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = const T&amp;&#65292;A = &#20989;&#25968;&#27169;&#26495;&#65306;T &#22788;&#20110;&#19981;&#25512;&#23548;&#35821;&#22659;</span></pre></div>
</div>
</div>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx11">
<td>
<div class="t-li1"><span class="t-li">6)</span> &#24418;&#21442; <code><b>P</b></code>&#65292;&#20854;&#23454;&#21442; <code><b>A</b></code> &#26159;<span class="t-rev-inl t-since-cxx17"><span>&#33457;&#25324;&#21495;&#21021;&#22987;&#21270;&#22120;&#21015;&#34920;&#65292;&#20294; <code><b>P</b></code> &#38750; <span class="t-lc"><a href="cpp-utility-initializer_list.html">std::initializer_list</a></span>&#12289;&#21040;&#23427;&#30340;&#24341;&#29992;&#65288;&#21487;&#20197;&#26377; cv &#38480;&#23450;&#65289;&#65292;&#25110;&#32773;</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></span></span>&#21040;&#25968;&#32452;&#30340;&#24341;&#29992;&#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">class</span> T<span class="sy1">&gt;</span> <span class="kw4">void</span> g1<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>T<span class="sy1">&gt;</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="sy1">&gt;</span> <span class="kw4">void</span> g2<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>T<span class="sy1">&gt;</span>, T x<span class="br0">)</span><span class="sy4">;</span>
g1<span class="br0">(</span><span class="br0">{</span><span class="nu0">1</span>, <span class="nu0">2</span>, <span class="nu0">3</span><span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = std::vector&lt;T&gt;&#65292;A = {1, 2, 3}&#65306;T &#22312;&#19981;&#25512;&#23548;&#35821;&#22659;&#20013;</span>
<span class="co1">// &#38169;&#35823;&#65306;T &#27809;&#26377;&#34987;&#26174;&#24335;&#25351;&#23450;&#25110;&#20174;&#21478;&#19968;&#23545; P/A &#25512;&#23548;&#20986;</span>
g2<span class="br0">(</span><span class="br0">{</span><span class="nu0">1</span>, <span class="nu0">2</span>, <span class="nu0">3</span><span class="br0">}</span>, <span class="nu0">10</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P1 = std::vector&lt;T&gt;&#65292;A1 = {1, 2, 3}&#65306;T &#22312;&#19981;&#25512;&#23548;&#35821;&#22659;&#20013;</span>
<span class="co1">// P2 = T&#65292;A2 = int&#65306;&#25512;&#23548;&#20986; T = int</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">7)</span> &#20316;&#20026;&#24418;&#21442;&#21253;&#19988;&#27809;&#26377;&#22312;&#24418;&#21442;&#21015;&#34920;&#23614;&#37096;&#20986;&#29616;&#30340;&#24418;&#21442; <code><b>P</b></code>&#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">class</span>... <span class="me1">Ts</span>, <span class="kw1">class</span> T<span class="sy1">&gt;</span> <span class="kw4">void</span> f1<span class="br0">(</span>T n, Ts... <span class="me1">args</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span>... <span class="me1">Ts</span>, <span class="kw1">class</span> T<span class="sy1">&gt;</span> <span class="kw4">void</span> f2<span class="br0">(</span>Ts... <span class="me1">args</span>, T n<span class="br0">)</span><span class="sy4">;</span>
f1<span class="br0">(</span><span class="nu0">1</span>, <span class="nu0">2</span>, <span class="nu0">3</span>, <span class="nu0">4</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P1 = T&#65292;A1 = 1&#65306;&#25512;&#23548;&#20986; T = int</span>
<span class="co1">// P2 = Ts...&#65292;A2 = 2&#65292;A3 = 3&#65292;A4 = 4&#65306;&#25512;&#23548;&#20986; Ts = [int, int, int]</span>
f2<span class="br0">(</span><span class="nu0">1</span>, <span class="nu0">2</span>, <span class="nu0">3</span>, <span class="nu0">4</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P1 = Ts...&#65306;Ts &#22312;&#19981;&#25512;&#23548;&#35821;&#22659;</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">8)</span> &#22312;&#24418;&#21442; <code><b>P</b></code> &#20013;&#20986;&#29616;&#19988;&#21253;&#21547;&#19981;&#22312;&#27169;&#26495;&#24418;&#21442;&#21015;&#34920;&#26368;&#23614;&#31471;&#30340;&#21253;&#23637;&#24320;&#30340;&#27169;&#26495;&#24418;&#21442;&#21015;&#34920;&#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="kw4">int</span>...<span class="sy1">&gt;</span> <span class="kw1">struct</span> T <span class="br0">{</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span>... <span class="me1">Ts1</span>, <span class="kw4">int</span> N, <span class="kw4">int</span>... <span class="me1">Ts2</span><span class="sy1">&gt;</span>
<span class="kw4">void</span> good<span class="br0">(</span><span class="kw4">const</span> T<span class="sy1">&lt;</span>N, Ts1...<span class="sy1">&gt;</span><span class="sy3">&amp;</span> arg1, <span class="kw4">const</span> T<span class="sy1">&lt;</span>N, Ts2...<span class="sy1">&gt;</span><span class="sy3">&amp;</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span>... <span class="me1">Ts1</span>, <span class="kw4">int</span> N, <span class="kw4">int</span>... <span class="me1">Ts2</span><span class="sy1">&gt;</span>
<span class="kw4">void</span> bad<span class="br0">(</span><span class="kw4">const</span> T<span class="sy1">&lt;</span>Ts1..., N<span class="sy1">&gt;</span><span class="sy3">&amp;</span> arg1, <span class="kw4">const</span> T<span class="sy1">&lt;</span>Ts2..., N<span class="sy1">&gt;</span><span class="sy3">&amp;</span><span class="br0">)</span><span class="sy4">;</span>
T<span class="sy1">&lt;</span><span class="nu0">1</span>, <span class="nu0">2</span><span class="sy1">&gt;</span> t1<span class="sy4">;</span>
T<span class="sy1">&lt;</span><span class="nu0">1</span>, <span class="sy2">-</span><span class="nu0">1</span>, <span class="nu0">0</span><span class="sy1">&gt;</span> t2<span class="sy4">;</span>
good<span class="br0">(</span>t1, t2<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P1 = const T&lt;N, Ts1...&gt;&amp;&#65292;A1 = T&lt;1, 2&gt;&#65306;</span>
<span class="co1">// &#25512;&#23548;&#20986; N = 1 &#20197;&#21450; Ts1 = [2]</span>
<span class="co1">// P2 = const T&lt;N, Ts2...&gt;&amp;&#65292;A2 = T&lt;1, -1, 0&gt;&#65306;</span>
<span class="co1">// &#25512;&#23548;&#20986; N = 1 &#20197;&#21450; Ts2 = [-1, 0]</span>
bad<span class="br0">(</span>t1, t2<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P1 = const T&lt;Ts1..., N&gt;&amp;&#65292;A1 = T&lt;1, 2&gt;&#65306;</span>
<span class="co1">// &lt;Ts1..., N&gt; &#22788;&#20110;&#19981;&#25512;&#23548;&#35821;&#22659;</span>
<span class="co1">// P2 = const T&lt;Ts2..., N&gt;&amp;&#65292;A2 = T&lt;1, -1, 0&gt;&#65306;</span>
<span class="co1">// &lt;Ts2..., N&gt; &#22788;&#20110;&#19981;&#25512;&#23548;&#35821;&#22659;</span></pre></div>
</div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
</table>
<div class="t-li1"><span class="t-li">9)</span> &#25968;&#32452;&#65288;&#19981;&#32771;&#34385;&#21040;&#25968;&#32452;&#30340;&#24341;&#29992;&#25110;&#25968;&#32452;&#30340;&#25351;&#38024;&#65289;&#31867;&#22411; <code><b>P</b></code> &#20013;&#30340;&#31532;&#19968;&#32500;&#25968;&#32452;&#36793;&#30028;&#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="kw4">int</span> i<span class="sy1">&gt;</span> <span class="kw4">void</span> f1<span class="br0">(</span><span class="kw4">int</span> a<span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span><span class="br0">[</span>i<span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span> i<span class="sy1">&gt;</span> <span class="kw4">void</span> f2<span class="br0">(</span><span class="kw4">int</span> a<span class="br0">[</span>i<span class="br0">]</span><span class="br0">[</span><span class="nu0">20</span><span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = int[i][20]&#65292;&#25968;&#32452;&#31867;&#22411;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span> i<span class="sy1">&gt;</span> <span class="kw4">void</span> f3<span class="br0">(</span><span class="kw4">int</span> <span class="br0">(</span><span class="sy3">&amp;</span>a<span class="br0">)</span><span class="br0">[</span>i<span class="br0">]</span><span class="br0">[</span><span class="nu0">20</span><span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = int(&amp;)[i][20]&#65292;&#21040;&#25968;&#32452;&#30340;&#24341;&#29992;</span>
<span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="kw4">int</span> a<span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span><span class="br0">[</span><span class="nu0">20</span><span class="br0">]</span><span class="sy4">;</span>
f1<span class="br0">(</span>a<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#25512;&#23548;&#20986; i = 20</span>
f1<span class="sy1">&lt;</span><span class="nu0">20</span><span class="sy1">&gt;</span><span class="br0">(</span>a<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK</span>
f2<span class="br0">(</span>a<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;i &#22788;&#20110;&#19981;&#25512;&#23548;&#35821;&#22659;</span>
f2<span class="sy1">&lt;</span><span class="nu0">10</span><span class="sy1">&gt;</span><span class="br0">(</span>a<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK</span>
f3<span class="br0">(</span>a<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#25512;&#23548;&#20986; i = 10</span>
f3<span class="sy1">&lt;</span><span class="nu0">10</span><span class="sy1">&gt;</span><span class="br0">(</span>a<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK</span>
<span class="br0">}</span></pre></div>
</div>
</div>
<p>&#22312;&#20219;&#20309;&#24773;&#20917;&#19979;&#65292;&#22914;&#26524;&#31867;&#22411;&#21517;&#30340;&#20219;&#20309;&#37096;&#20998;&#19981;&#20250;&#34987;&#25512;&#23548;&#65292;&#37027;&#20040;&#25972;&#20010;&#31867;&#22411;&#22788;&#20110;&#19981;&#25512;&#23548;&#35821;&#22659;&#12290;&#28982;&#32780;&#22797;&#21512;&#31867;&#22411;&#21487;&#20197;&#21516;&#26102;&#21253;&#21547;&#25512;&#23548;&#21644;&#19981;&#25512;&#23548;&#30340;&#31867;&#22411;&#21517;&#12290;&#20363;&#22914;&#22312; <span class="t-c"><span class="mw-geshi cpp source-cpp">A<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">B</span><span class="sy1">&lt;</span>T2<span class="sy1">&gt;</span></span></span> &#20013;&#65292;<code>T</code> &#22240;&#20026;&#35268;&#21017; #1&#65288;&#23884;&#22871;&#31867;&#22411;&#35828;&#26126;&#31526;&#65289;&#32780;&#19981;&#20250;&#34987;&#25512;&#23548;&#65292;&#19988; <code>T2</code> &#22240;&#20026;&#23427;&#26159;&#21516;&#19968;&#31867;&#22411;&#21517;&#30340;&#19968;&#37096;&#20998;&#20063;&#19981;&#20250;&#34987;&#25512;&#23548;&#65292;&#20294;&#22312; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="br0">(</span><span class="sy2">*</span>f<span class="br0">)</span><span class="br0">(</span><span class="kw1">typename</span> A<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">B</span>, A<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">)</span></span></span> &#20013;&#65292;&#22312; <span class="t-c"><span class="mw-geshi cpp source-cpp">A<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span></span></span> &#20013;&#30340; <code>T</code> &#20250;&#34987;&#25512;&#23548;&#26102; <span class="t-c"><span class="mw-geshi cpp source-cpp">A<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">B</span></span></span> &#20013;&#30340; <code>T</code> &#20063;&#65288;&#22240;&#20026;&#30456;&#21516;&#35268;&#21017;&#65289;&#19981;&#20250;&#34987;&#25512;&#23548;&#12290;</p>
<h4><span class="mw-headline" id=".E4.BB.8E.E7.B1.BB.E5.9E.8B.E6.8E.A8.E5.AF.BC">&#20174;&#31867;&#22411;&#25512;&#23548;</span></h4>
<p>&#32473;&#23450;&#20381;&#36182;&#19968;&#25110;&#22810;&#20010;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442; <code><b>T</b></code>i&#12289;&#27169;&#26495;&#27169;&#26495;&#24418;&#21442; <code><b>TT</b></code>i &#25110;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442; <code><b>I</b></code>i &#30340;&#27169;&#26495;&#24418;&#21442; <code><b>P</b></code> &#21450;&#20854;&#23545;&#24212;&#23454;&#21442; <code><b>A</b></code>&#65292;&#33509; <code><b>P</b></code> &#25317;&#26377;&#19979;&#21015;&#24418;&#24335;&#20043;&#19968;&#21017;&#36827;&#34892;&#25512;&#23548;&#65306;</p>
<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;&#23613;&#21487;&#33021;&#21015;&#20986;&#24102;&#24494;&#31034;&#20363;&#30340;&#34920;&#26684;</td>
</tr>
</table>
<ul>
<li><code>T</code>;</li>
<li><code>cv-list T</code>;</li>
<li><code>T*</code>;</li>
<li><code>T&amp;</code>;</li>
<li><code>T&amp;&amp;</code>;</li>
<li><code>T[&#25972;&#25968;&#24120;&#37327;]</code>;</li>
<li><code>&#31867;&#27169;&#26495;&#21517;&lt;T&gt;</code>;</li>
<li><code>&#31867;&#22411;(T)</code>;</li>
<li><code>T()</code>;</li>
<li><code>T(T)</code>;</li>
<li><code>T &#31867;&#22411;::*</code>;</li>
<li><code>&#31867;&#22411; T::*</code>;</li>
<li><code>T T::*</code>;</li>
<li><code>T(&#31867;&#22411;::*)()</code>;</li>
<li><code>&#31867;&#22411;(T::*)()</code>;</li>
<li><code>&#31867;&#22411;(&#31867;&#22411;::*)(T)</code>;</li>
<li><code>&#31867;&#22411;(T::*)(T)</code>;</li>
<li><code>T (&#31867;&#22411;::*)(T)</code>;</li>
<li><code>T (T::*)()</code>;</li>
<li><code>T (T::*)(T)</code>;</li>
<li><code>&#31867;&#22411;[i]</code>;</li>
<li><code>&#31867;&#27169;&#26495;&#21517;&lt;I&gt;</code>;</li>
<li><code>TT&lt;T&gt;</code>;</li>
<li><code>TT&lt;I&gt;</code>;</li>
<li><code>TT&lt;&gt;</code>;</li>
</ul>
<p>&#20854;&#20013;</p>
<ul>
<li><code>(T)</code> &#26159;&#20854;&#20013;&#33267;&#23569;&#26377;&#19968;&#20010;&#24418;&#21442;&#31867;&#22411;&#21547;&#26377; T &#30340;&#20989;&#25968;&#24418;&#21442;&#21015;&#34920;&#65307;</li>
<li><code>()</code> &#26159;&#20854;&#20013;&#27809;&#26377;&#21547;&#26377; T &#30340;&#24418;&#21442;&#30340;&#20989;&#25968;&#24418;&#21442;&#21015;&#34920;&#65307;</li>
<li><code>&lt;T&gt;</code> &#26159;&#33267;&#23569;&#19968;&#20010;&#23454;&#21442;&#21547;&#26377; T &#30340;&#27169;&#26495;&#23454;&#21442;&#21015;&#34920;&#65307;</li>
<li><code>&lt;I&gt;</code> &#26159;&#20854;&#20013;&#33267;&#23569;&#19968;&#20010;&#23454;&#21442;&#21547;&#26377; I &#30340;&#27169;&#26495;&#23454;&#21442;&#21015;&#34920;&#65307;</li>
<li><code>&lt;&gt;</code> &#20854;&#20013;&#27809;&#26377;&#21547;&#26377; T &#25110; I &#30340;&#23454;&#21442;&#30340;&#27169;&#26495;&#23454;&#21442;&#21015;&#34920;&#12290;</li>
</ul>
<p>&#22914;&#26524; <code><b>P</b></code> &#20855;&#26377;&#21253;&#21547;&#27169;&#26495;&#24418;&#21442;&#21015;&#34920; <code><b>&lt;T&gt;</b></code> &#25110; <code><b>&lt;I&gt;</b></code> &#30340;&#24418;&#24335;&#20043;&#19968;&#65292;&#37027;&#20040;&#23558;&#35813;&#27169;&#26495;&#24418;&#21442;&#21015;&#34920;&#30340;&#27599;&#20010;&#20803;&#32032; <code><b>P</b></code>i &#19982;&#20854; <code><b>A</b></code> &#30340;&#23545;&#24212;&#27169;&#26495;&#23454;&#21442; <code><b>A</b></code>i &#36827;&#34892;&#21305;&#37197;&#12290;&#22914;&#26524;&#26368;&#21518;&#19968;&#20010; <code><b>P</b></code>i &#26159;&#21253;&#23637;&#24320;&#65292;&#37027;&#20040;&#23558;&#20854;&#27169;&#24335;&#19982; <code><b>A</b></code> &#30340;&#27169;&#26495;&#23454;&#21442;&#21015;&#34920;&#20013;&#30340;&#27599;&#20010;&#21097;&#20313;&#23454;&#21442;&#36827;&#34892;&#27604;&#36739;&#12290;&#20854;&#20182;&#24773;&#20917;&#19979;&#19981;&#25512;&#23548;&#30340;&#23614;&#38543;&#21442;&#25968;&#21253;&#20250;&#34987;&#25512;&#23548;&#20026;&#31354;&#24418;&#21442;&#21253;&#12290;</p>
<p>&#22914;&#26524; <code><b>P</b></code> &#20855;&#26377;&#21253;&#21547;&#20989;&#25968;&#24418;&#21442;&#21015;&#34920; <code><b>(T)</b></code> &#30340;&#24418;&#24335;&#65292;&#37027;&#20040;&#23558;&#26469;&#33258;&#35813;&#21015;&#34920;&#30340;&#27599;&#20010;&#24418;&#21442; <code><b>P</b></code>i &#19982;&#26469;&#33258; <code><b>A</b></code> &#30340;&#20989;&#25968;&#24418;&#21442;&#21015;&#34920;&#30340;&#23545;&#24212;&#23454;&#21442; <code><b>A</b></code>i &#36827;&#34892;&#27604;&#36739;&#12290;&#22914;&#26524;&#26368;&#21518;&#19968;&#20010; <code><b>P</b></code>i &#26159;&#21253;&#23637;&#24320;&#65292;&#37027;&#20040;&#23558;&#20854;&#22768;&#26126;&#31526;&#21644; <code><b>A</b></code> &#30340;&#24418;&#21442;&#31867;&#22411;&#21015;&#34920;&#20013;&#30340;&#27599;&#20010;&#21097;&#20313;&#30340; <code><b>A</b></code>i &#36827;&#34892;&#27604;&#36739;&#12290;</p>
<p>&#36825;&#20123;&#24418;&#24335;&#21487;&#20197;&#23884;&#22871;&#24182;&#36882;&#24402;&#22788;&#29702;&#65306;<code>X&lt;int&gt;(*)(char[6])</code> &#26159;&#19968;&#20010; <code>&#31867;&#22411;(*)(T)</code> &#30340;&#20363;&#23376;&#65292;&#20854;&#20013; <i>&#31867;&#22411;</i> &#26159; <code>&#31867;&#27169;&#26495;&#21517;&lt;T&gt;</code> &#32780; T &#26159; <code>&#31867;&#22411;[i]</code>&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-until-cxx17">
<td>
<p>&#19981;&#33021;&#20174;&#38750;&#31867;&#22411;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#31867;&#22411;&#27169;&#26495;&#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">typename</span> T, T i<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">double</span> a<span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span><span class="br0">[</span>i<span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">double</span> v<span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span><span class="br0">[</span><span class="nu0">20</span><span class="br0">]</span><span class="sy4">;</span>
f<span class="br0">(</span>v<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = double[10][i] &#65292; A = double[10][20]:</span>
<span class="co1">// i &#33021;&#34987;&#25512;&#23548;&#20026;&#31561;&#20110; 20</span>
<span class="co1">// &#20294;&#19981;&#33021;&#20174; i &#30340;&#31867;&#22411;&#25512;&#23548; T</span></pre></div>
</div>
</td>
<td><span class="t-mark-rev t-until-cxx17">(C++17 &#21069;)</span></td>
</tr>
<tr class="t-rev t-since-cxx17">
<td>
<p>&#24403;&#20174;&#34920;&#36798;&#24335;&#25512;&#23548;&#23545;&#24212;&#20110;&#26576;&#20010;&#20197;&#24453;&#20915;&#31867;&#22411;&#22768;&#26126;&#30340;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442; P &#30340;&#23454;&#21442;&#30340;&#20540;&#26102;&#65292;&#20174;&#35813;&#20540;&#30340;&#31867;&#22411;&#25512;&#23548; P &#30340;&#31867;&#22411;&#20013;&#30340;&#27169;&#26495;&#24418;&#21442;&#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="kw4">long</span> n<span class="sy1">&gt;</span> <span class="kw1">struct</span> A <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">class</span> T<span class="sy1">&gt;</span> <span class="kw1">struct</span> C<span class="sy4">;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span> T, T n<span class="sy1">&gt;</span> <span class="kw1">struct</span> C<span class="sy1">&lt;</span>A<span class="sy1">&lt;</span>n<span class="sy1">&gt;&gt;</span> <span class="br0">{</span> <span class="kw1">using</span> Q <span class="sy1">=</span> T<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">typedef</span> <span class="kw4">long</span> R<span class="sy4">;</span>
<span class="kw1">typedef</span> C<span class="sy1">&lt;</span>A<span class="sy1">&lt;</span><span class="nu0">2</span><span class="sy1">&gt;&gt;</span><span class="sy4">::</span><span class="me2">Q</span> R<span class="sy4">;</span> <span class="co1">// OK&#65306;&#20174;&#31867;&#22411; A&lt;2&gt; &#20013;&#30340;&#27169;&#26495;&#23454;&#21442;&#20540;&#25512;&#23548;&#20986; T = long</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw4">auto</span> X<span class="sy1">&gt;</span> <span class="kw1">class</span> bar<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">class</span> T, T n<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span>bar<span class="sy1">&lt;</span>n<span class="sy1">&gt;</span> x<span class="br0">)</span><span class="sy4">;</span>
f<span class="br0">(</span>bar<span class="sy1">&lt;</span><span class="nu0">3</span><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&#65306;&#20174;&#31867;&#22411; bar&lt;3&gt; &#20013;&#30340;&#27169;&#26495;&#23454;&#21442;&#20540;&#25512;&#23548;&#20986; T = int&#65288;&#20197;&#21450; n = 3&#65289;</span></pre></div>
</div>
<p>&#31867;&#22411; <code>t[N]</code> &#20013; <code>N</code> &#30340;&#31867;&#22411;&#26159; <span class="t-lc"><a href="cpp-types-size_t.html">std::size_t</a></span>&#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, T i<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">int</span> <span class="br0">(</span><span class="sy3">&amp;</span>a<span class="br0">)</span><span class="br0">[</span>i<span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">int</span> v<span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span><span class="sy4">;</span>
f<span class="br0">(</span>v<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;T &#26159; std::size_t</span></pre></div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></td>
</tr>
</table>
<p>&#22914;&#26524;&#22312;&#24418;&#21442;&#21015;&#34920;&#20013;&#20351;&#29992;&#26576;&#20010;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#24182;&#25512;&#23548;&#20102;&#23427;&#23545;&#24212;&#30340;&#27169;&#26495;&#23454;&#21442;&#65292;&#37027;&#20040;&#25512;&#23548;&#20986;&#30340;&#27169;&#26495;&#23454;&#21442;&#31867;&#22411;&#65288;&#22914;&#21516;&#22312;&#23427;&#30340;&#22806;&#22260;&#27169;&#26495;&#24418;&#21442;&#21015;&#34920;&#20013;&#25351;&#23450;&#65292;&#36825;&#34920;&#31034;&#24341;&#29992;&#34987;&#20445;&#30041;&#65289;&#24517;&#39035;&#19982;&#35813;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#30340;&#31867;&#22411;&#20005;&#26684;&#21305;&#37197;&#65292;&#20294; cv &#38480;&#23450;&#31526;&#34987;&#20002;&#24323;&#65292;&#19988;&#19981;&#21253;&#25324;&#20174;&#25968;&#32452;&#36793;&#30028;&#25512;&#23548;&#30340;&#27169;&#26495;&#23454;&#21442;&mdash;&mdash;&#27492;&#26102;&#20801;&#35768;&#20219;&#20309;&#21253;&#25324; bool &#22312;&#20869;&#65288;&#34429;&#28982;&#23427;&#24635;&#26159;&#21464;&#20026; true &#20540;&#65289;&#30340;&#25972;&#25968;&#31867;&#22411;&#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="kw4">int</span> i<span class="sy1">&gt;</span> <span class="kw1">class</span> A <span class="br0">{</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">short</span> s<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span>A<span class="sy1">&lt;</span>s<span class="sy1">&gt;</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#30340;&#31867;&#22411;&#26159; short</span>
<span class="kw4">void</span> k1<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
A<span class="sy1">&lt;</span><span class="nu0">1</span><span class="sy1">&gt;</span> a<span class="sy4">;</span> <span class="co1">// a &#30340;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#30340;&#31867;&#22411;&#26159; int</span>
f<span class="br0">(</span>a<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = A&lt;(short)s&gt;, A = A&lt;(int)1&gt;</span>
<span class="co1">// &#38169;&#35823;&#65306;&#25512;&#23548;&#20986;&#30340;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#25317;&#26377;&#19982;&#23545;&#24212;&#27169;&#26495;&#23454;&#21442;&#19981;&#21516;&#30340;&#31867;&#22411;</span>
f<span class="sy1">&lt;</span><span class="nu0">1</span><span class="sy1">&gt;</span><span class="br0">(</span>a<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#19981;&#25512;&#23548;&#27169;&#26495;&#23454;&#21442;&#65292;&#36825;&#20250;&#35843;&#29992; f&lt;(short)1&gt;(A&lt;(short)1&gt;)</span>
<span class="br0">}</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy3">&amp;</span><span class="sy1">&gt;</span> <span class="kw1">struct</span> X<span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy3">&amp;</span> R<span class="sy1">&gt;</span> <span class="kw4">void</span> k2<span class="br0">(</span>X<span class="sy1">&lt;</span>R<span class="sy1">&gt;</span><span class="sy3">&amp;</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">int</span> n<span class="sy4">;</span>
<span class="kw4">void</span> g<span class="br0">(</span>X<span class="sy1">&lt;</span>n<span class="sy1">&gt;</span> <span class="sy3">&amp;</span>x<span class="br0">)</span> <span class="br0">{</span>
k2<span class="br0">(</span>x<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = X&lt;R&gt;&#65292;A = X&lt;n&gt;</span>
<span class="co1">// struct X &#30340;&#22768;&#26126;&#20013;&#24418;&#21442;&#31867;&#22411;&#26159; int&amp;</span>
<span class="co1">// &#23454;&#21442;&#31867;&#22411;&#26159; int&amp;</span>
<span class="co1">// OK&#65288;&#22240; CWG 2091&#65289;&#65306;&#25512;&#23548;&#20986; R &#20197;&#25351;&#20195; n</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#19981;&#33021;&#20174;&#20989;&#25968;&#40664;&#35748;&#23454;&#21442;&#30340;&#31867;&#22411;&#25512;&#23548;&#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="kw4">void</span> f<span class="br0">(</span>T <span class="sy1">=</span> <span class="nu0">5</span>, T <span class="sy1">=</span> <span class="nu0">7</span><span class="br0">)</span><span class="sy4">;</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">1</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#35843;&#29992; f&lt;int&gt;(1, 7)</span>
f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#26080;&#27861;&#25512;&#23548;&#20986; T</span>
f<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#35843;&#29992; f&lt;int&gt;(5, 7)</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#27169;&#26495;&#27169;&#26495;&#24418;&#21442;&#30340;&#25512;&#23548;&#21487;&#20197;&#20351;&#29992;&#20989;&#25968;&#35843;&#29992;&#20013;&#25152;&#29992;&#30340;&#27169;&#26495;&#29305;&#21270;&#20013;&#25152;&#20351;&#29992;&#30340;&#31867;&#22411;&#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">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span><span class="sy1">&gt;</span> <span class="kw1">class</span> X<span class="sy1">&gt;</span> <span class="kw1">struct</span> A <span class="br0">{</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// A &#26159;&#19968;&#20010;&#25317;&#26377;&#27169;&#26495;&#27169;&#26495;&#24418;&#21442;&#30340;&#27169;&#26495;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span><span class="sy1">&gt;</span> <span class="kw1">class</span> TT<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span>A<span class="sy1">&lt;</span>TT<span class="sy1">&gt;</span><span class="br0">)</span> <span class="br0">{</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="kw1">struct</span> B <span class="br0">{</span> <span class="br0">}</span><span class="sy4">;</span>
A<span class="sy1">&lt;</span>B<span class="sy1">&gt;</span> ab<span class="sy4">;</span>
f<span class="br0">(</span>ab<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// P = A&lt;TT&gt;&#65292;A = A&lt;B&gt;&#65306;&#25512;&#23548;&#20986; TT = B&#65292;&#35843;&#29992; f(A&lt;B&gt;)</span></pre></div>
</div>
<p>&#27880;&#35299;&#65306;&#30001;&#20110; <a href="cpp-language-noexcept_spec.html">noexcept &#35828;&#26126;</a>&#20174; C++17 &#36215;&#25104;&#20026;&#31867;&#22411;&#30340;&#19968;&#37096;&#20998;&#65292;&#26377;&#20123;&#32534;&#35793;&#22120;&#65288;&#20363;&#22914; GCC&#12289; Clang &#19982; ICC&#65292;&#20294;&#19981;&#21547; MSVC&#65289;&#33021;&#22312; C++17 &#25110;&#26356;&#26032;&#30340;&#27169;&#24335;&#20174;&#31867;&#22411;&#25512;&#23548; <code>noexcept</code> &#35828;&#26126;&#31526;&#20013;&#30340;&#20540;&#12290;&#36825;&#31181;&#29305;&#24615;&#36824;&#27809;&#26377;&#34987;&#26631;&#20934;&#25509;&#21463;&#12290;&#36825;&#23601;&#26159; <a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue2355">CWG &#38382;&#39064; 2355</a> &#12290;</p>
<h3><span class="mw-headline" id=".E5.85.B6.E4.BB.96.E8.AF.AD.E5.A2.83">&#20854;&#20182;&#35821;&#22659;</span></h3>
<p>&#38500;&#20102;&#20989;&#25968;&#35843;&#29992;&#21644;&#36816;&#31639;&#31526;&#34920;&#36798;&#24335;&#20197;&#22806;&#65292;&#20197;&#19979;&#22330;&#21512;&#20063;&#20351;&#29992;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#65306;</p>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx11">
<td>
<h4><span class="mw-headline" id="auto_.E7.B1.BB.E5.9E.8B.E6.8E.A8.E5.AF.BC">auto &#31867;&#22411;&#25512;&#23548;</span></h4>
<p>&#24403;&#21464;&#37327;<a href="cpp-language-declarations.html">&#22768;&#26126;</a>&#38656;&#35201;&#20174;&#21464;&#37327;&#30340;&#21021;&#22987;&#21270;&#22120;&#25512;&#23548; <b><a href="cpp-language-auto.html">auto &#35828;&#26126;&#31526;</a></b>&#30340;&#21547;&#20041;&#26102;&#20250;&#29992;&#21040;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#12290;</p>
<p>&#36890;&#36807;&#20197;&#19979;&#26041;&#24335;&#33719;&#24471;&#24418;&#21442; <code><b>P</b></code>&#65306;&#22312;&#21464;&#37327;&#30340;&#34987;&#22768;&#26126;&#31867;&#22411; <code>T</code>&#65288;&#21253;&#21547; <code>auto</code>&#65289;&#20013;&#65292;<code>auto</code> &#30340;&#27599;&#27425;&#20986;&#29616;&#37117;&#34987;&#26367;&#25442;&#25104;&#19968;&#20010;&#34394;&#26500;&#30340;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442; <code>U</code>&#65292;&#25110;&#22312;&#23427;&#30340;&#21021;&#22987;&#21270;&#26159;&#22797;&#21046;&#21015;&#34920;&#21021;&#22987;&#21270;&#26102;&#26367;&#25442;&#25104; <code>std::initializer_list&lt;U&gt;</code>&#12290;&#23454;&#21442; <code><b>A</b></code> &#26159;&#21021;&#22987;&#21270;&#22120;&#34920;&#36798;&#24335;&#12290;&#25353;&#19978;&#25991;&#25152;&#36848;&#30340;&#35268;&#21017;&#20174; <code><b>P</b></code> &#21644; <code><b>A</b></code> &#25512;&#23548;&#20986; <code>U</code> &#21518;&#65292;&#23558;&#25512;&#23548;&#20986;&#30340; <code>U</code> &#26367;&#25442;&#21040; <code>P</code> &#20013;&#20197;&#33719;&#21462;&#23454;&#38469;&#30340;&#21464;&#37327;&#31867;&#22411;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw4">const</span> <span class="kw4">auto</span><span class="sy3">&amp;</span> x <span class="sy1">=</span> <span class="nu0">1</span> <span class="sy2">+</span> <span class="nu0">2</span><span class="sy4">;</span> <span class="co1">// P = const U&amp;&#65292;A = 1 + 2&#65306;</span>
<span class="co1">// &#19982;&#35843;&#29992; f(1 + 2) &#30340;&#35268;&#21017;&#30456;&#21516;&#65292;&#20854;&#20013; f &#26159;</span>
<span class="co1">// template&lt;class U&gt; void f(const U&amp; u)</span>
<span class="co1">// &#25512;&#23548;&#20986; U = int&#65292;x &#30340;&#31867;&#22411;&#26159; const int&amp;</span>
<span class="kw4">auto</span> l <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">13</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// P = std::initializer_list&lt;U&gt;&#65292;A = {13}&#65306;</span>
<span class="co1">// &#25512;&#23548;&#20986; U = int&#65292;l &#30340;&#31867;&#22411;&#26159; std::initializer_list&lt;int&gt;</span></pre></div>
</div>
<p>&#22312;&#30452;&#25509;&#21015;&#34920;&#21021;&#22987;&#21270;&#65288;&#20294;&#19981;&#26159;&#22797;&#21046;&#21015;&#34920;&#21021;&#22987;&#21270;&#65289;&#20013;&#65292;&#24403;&#20174;&#33457;&#25324;&#21495;&#21021;&#22987;&#21270;&#22120;&#21015;&#34920;&#25512;&#23548; <a href="cpp-language-auto.html">auto</a> &#30340;&#21547;&#20041;&#26102;&#65292;&#33457;&#25324;&#21495;&#21021;&#22987;&#21270;&#22120;&#21015;&#34920;&#24517;&#39035;&#21482;&#21547;&#19968;&#20010;&#20803;&#32032;&#65292;&#32780; auto &#30340;&#31867;&#22411;&#23558;&#26159;&#35813;&#20803;&#32032;&#30340;&#31867;&#22411;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw4">auto</span> x1 <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">3</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// x1 &#26159; std::initializer_list&lt;int&gt;</span>
<span class="kw4">auto</span> x2<span class="br0">{</span><span class="nu0">1</span>, <span class="nu0">2</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#19981;&#27490;&#21333;&#20010;&#20803;&#32032;</span>
<span class="kw4">auto</span> x3<span class="br0">{</span><span class="nu0">3</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// x3 &#26159; int</span>
<span class="co1">//&#65288;N3922 &#20043;&#21069;&#65292;x2 &#21644; x3 &#37117;&#26159; std::initializer_list&lt;int&gt;&#65289;</span></pre></div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
</table>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx14">
<td>
<h4><span class="mw-headline" id=".E8.BF.94.E5.9B.9E_auto_.E7.9A.84.E5.87.BD.E6.95.B0">&#36820;&#22238; auto &#30340;&#20989;&#25968;</span></h4>
<p>&#24403;&#20174; return &#35821;&#21477;&#25512;&#23548;&#20989;&#25968;&#36820;&#22238;&#31867;&#22411;&#20013;&#30340; <a href="cpp-language-auto.html">auto</a> &#35828;&#26126;&#31526;&#30340;&#21547;&#20041;&#26102;&#65292;&#23558;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#29992;&#20110;<a href="cpp-language-functions.html">&#20989;&#25968;</a>&#30340;&#22768;&#26126;&#12290;</p>
<p>&#23545;&#20110;&#36820;&#22238; auto &#30340;&#20989;&#25968;&#65292;&#36890;&#36807;&#20197;&#19979;&#26041;&#24335;&#33719;&#24471;&#24418;&#21442; <code><b>P</b></code>&#65306;&#22312;&#34987;&#22768;&#26126;&#20989;&#25968;&#30340;&#36820;&#22238;&#31867;&#22411; <code>T</code>&#65288;&#21253;&#21547; <code>auto</code>&#65289;&#20013;&#65292;<code>auto</code> &#30340;&#27599;&#27425;&#20986;&#29616;&#37117;&#20250;&#34987;&#26367;&#25442;&#25104;&#19968;&#20010;&#34394;&#26500;&#30340;&#31867;&#22411;&#27169;&#26495;&#23454;&#21442; <code>U</code>&#12290;&#23454;&#21442; <code><b>A</b></code> &#26159; <a href="cpp-language-return.html">return</a> &#35821;&#21477;&#30340;&#34920;&#36798;&#24335;&#65292;&#32780;&#22914;&#26524; return &#35821;&#21477;&#27809;&#26377;&#25805;&#20316;&#25968;&#65292;&#37027;&#20040; <code><b>A</b></code> &#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="br0">(</span><span class="br0">)</span></span></span>&#12290;&#25353;&#19978;&#25991;&#25152;&#36848;&#30340;&#35268;&#21017;&#20174; <code><b>P</b></code> &#21644; <code><b>A</b></code> &#25512;&#23548;&#20986; <code>U</code> &#21518;&#65292;&#23558;&#25512;&#23548;&#20986;&#30340; <code>U</code> &#26367;&#25442;&#21040; <code>T</code> &#20013;&#20197;&#33719;&#21462;&#23454;&#38469;&#30340;&#36820;&#22238;&#31867;&#22411;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw4">auto</span> f<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="nu0">42</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// P = auto&#65292;A = 42&#65306;</span>
<span class="co1">// &#25512;&#23548;&#20986; U = int&#65292;f &#30340;&#36820;&#22238;&#31867;&#22411;&#26159; int</span></pre></div>
</div>
<p>&#22914;&#26524;&#36825;&#31181;&#20989;&#25968;&#25317;&#26377;&#22810;&#20010; return &#35821;&#21477;&#65292;&#37027;&#20040;&#23601;&#20250;&#23545;&#27599;&#20010; return &#35821;&#21477;&#36827;&#34892;&#25512;&#23548;&#12290;&#25152;&#26377;&#32467;&#26524;&#31867;&#22411;&#24517;&#39035;&#30456;&#21516;&#65292;&#24182;&#25104;&#20026;&#35813;&#20989;&#25968;&#30340;&#23454;&#38469;&#36820;&#22238;&#31867;&#22411;&#12290;</p>
<p>&#22914;&#26524;&#36825;&#31181;&#20989;&#25968;&#27809;&#26377; return &#35821;&#21477;&#65292;&#37027;&#20040;&#25512;&#23548;&#26102; <code><b>A</b></code> &#26159; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="br0">(</span><span class="br0">)</span></span></span>&#12290;</p>
<p>&#27880;&#24847;&#65306;&#21464;&#37327;&#21644;&#20989;&#25968;&#22768;&#26126;&#20013;&#30340; <span class="t-c"><span class="mw-geshi cpp source-cpp">decltype<span class="br0">(</span><span class="kw4">auto</span><span class="br0">)</span></span></span> &#21344;&#20301;&#31526;&#30340;&#21547;&#20041;&#19981;&#20351;&#29992;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#12290;</p>
</td>
<td><span class="t-mark-rev t-since-cxx14">(C++14 &#36215;)</span></td>
</tr>
</table>
<h4><span class="mw-headline" id=".E9.87.8D.E8.BD.BD.E5.86.B3.E8.AE.AE">&#37325;&#36733;&#20915;&#35758;</span></h4>
<p>&#20174;&#20505;&#36873;&#27169;&#26495;&#20989;&#25968;&#29983;&#25104;&#29305;&#21270;&#26102;&#65292;&#22312;<a href="cpp-language-overload_resolution.html">&#37325;&#36733;&#20915;&#35758;</a>&#26399;&#38388;&#20351;&#29992;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#65306; &#20854; <code><b>P</b></code> &#21644; <code><b>A</b></code> &#21644;&#24120;&#35268;&#20989;&#25968;&#35843;&#29992;&#30456;&#21516;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a> s<span class="sy4">;</span>
<a href="cpp-string-basic_string-getline.html"><span class="kw1256">std::<span class="me2">getline</span></span></a><span class="br0">(</span><a href="cpp-io-cin.html"><span class="kw1756">std::<span class="me2">cin</span></span></a>, s<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &quot;std::getline&quot; &#25351;&#21517; 4 &#20010;&#20989;&#25968;&#27169;&#26495;&#65292;</span>
<span class="co1">// &#20854;&#20013; 2 &#20010;&#26159;&#20505;&#36873;&#20989;&#25968;&#65288;&#24418;&#21442;&#25968;&#27491;&#30830;&#65289;</span>
<span class="co1">// &#31532; 1 &#20505;&#36873;&#27169;&#26495;&#65306;</span>
<span class="co1">// P1 = std::basic_istream&lt;CharT, Traits&gt;&amp;&#65292;A1 = std::cin</span>
<span class="co1">// P2 = std::basic_string&lt;CharT, Traits, Allocator&gt;&amp;&#65292;A2 = s</span>
<span class="co1">// &#25512;&#23548;&#30830;&#23450;&#31867;&#22411;&#27169;&#26495;&#23454;&#21442; CharT&#12289;Traits &#21644; Allocator</span>
<span class="co1">// &#29305;&#21270; std::getline&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt;&gt;</span>
<span class="co1">// &#31532; 2 &#20505;&#36873;&#27169;&#26495;&#65306;</span>
<span class="co1">// P1 = std::basic_istream&lt;CharT, Traits&gt;&amp;&amp;&#65292;A1 = std::cin</span>
<span class="co1">// P2 = std::basic_string&lt;CharT, Traits, Allocator&gt;&amp;&#65292;A2 = s</span>
<span class="co1">// &#25512;&#23548;&#30830;&#23450;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442; CharT&#12289;Traits &#21644; Allocator</span>
<span class="co1">// &#29305;&#21270; std::getline&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt;&gt;</span>
<span class="co1">// &#37325;&#36733;&#20915;&#35758;&#23558;&#20174;&#24038;&#20540; std::cin &#32465;&#23450;&#30340;&#24341;&#29992;&#25490;&#22312;&#39640;&#20301;</span>
<span class="co1">// &#24182;&#36873;&#21462;&#20004;&#20010;&#20505;&#36873;&#29305;&#21270;&#30340;&#31532;&#19968;&#20010;</span></pre></div>
</div>
<p>&#22914;&#26524;&#25512;&#23548;&#22833;&#36133;&#65292;&#25110;&#25512;&#23548;&#25104;&#21151;&#20294;&#20135;&#29983;&#30340;&#29305;&#21270;&#26080;&#25928;&#65288;&#20363;&#22914;&#24418;&#21442;&#26082;&#26082;&#19981;&#26159;&#31867;&#31867;&#22411;&#20063;&#19981;&#26159;&#26522;&#20030;&#31867;&#22411;&#30340;&#37325;&#36733;&#36816;&#31639;&#31526;&#65289;&#65292;&#37027;&#20040;&#37325;&#36733;&#38598;&#19981;&#20250;&#21253;&#21547;&#35813;&#29305;&#21270;&#65292;&#36825;&#31867;&#20284;&#20110; <a href="cpp-language-sfinae.html">SFINAE</a>&#12290;</p>
<h4><span class="mw-headline" id=".E9.87.8D.E8.BD.BD.E9.9B.86.E7.9A.84.E5.9C.B0.E5.9D.80">&#37325;&#36733;&#38598;&#30340;&#22320;&#22336;</span></h4>
<p>&#21462;&#21253;&#21547;&#20989;&#25968;&#27169;&#26495;&#22312;&#20869;&#30340;<a href="cpp-language-overloaded_address.html">&#37325;&#36733;&#38598;&#30340;&#22320;&#22336;</a>&#26102;&#65292;&#20351;&#29992;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#12290;</p>
<p>&#20989;&#25968;&#27169;&#26495;&#30340;&#20989;&#25968;&#31867;&#22411;&#20026; <code><b>P</b></code>&#12290;<a href="cpp-language-overloaded_address.html">&#30446;&#26631;&#31867;&#22411;</a>&#26159; <code><b>A</b></code> &#30340;&#31867;&#22411;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <a href="cpp-io-manip-endl.html"><span class="kw1791">std::<span class="me2">endl</span></span></a><span class="sy4">;</span> <span class="co1">// std::endl &#25351;&#21517;&#20989;&#25968;&#27169;&#26495;</span>
<span class="co1">// endl &#30340;&#31867;&#22411; P =</span>
<span class="co1">// std::basic_ostream&lt;CharT, Traits&gt;&amp; (std::basic_ostream&lt;CharT, Traits&gt;&amp;)</span>
<span class="co1">// operator&lt;&lt; &#30340;&#24418;&#21442; A =</span>
<span class="co1">// std::basic_ostream&lt;char, std::char_traits&lt;char&gt;&gt;&amp; (*)(</span>
<span class="co1">// std::basic_ostream&lt;char, std::char_traits&lt;char&gt;&gt;&amp;</span>
<span class="co1">// )</span>
<span class="co1">// &#65288;&#20854;&#20182; operator&lt;&lt; &#30340;&#37325;&#36733;&#19981;&#21487;&#34892;&#65289;</span>
<span class="co1">// &#25512;&#23548;&#30830;&#23450;&#31867;&#22411;&#27169;&#26495;&#23454;&#21442; CharT &#21644; Traits</span></pre></div>
</div>
<p>&#36825;&#31181;&#24773;&#20917;&#19979;&#30340;&#25512;&#23548;&#36866;&#29992;&#19968;&#26465;&#39069;&#22806;&#30340;&#35268;&#21017;&#65306;&#24403;&#27604;&#36739;&#20989;&#25968;&#24418;&#21442; <code><b>P</b></code>i &#21644; <code><b>A</b></code>i &#26102;&#65292;&#22914;&#26524;&#26377;&#20219;&#20309; <code><b>P</b></code>i &#26159;&#21040;&#26080; cv &#38480;&#23450;&#27169;&#26495;&#24418;&#21442;&#30340;&#21491;&#20540;&#24341;&#29992;&#65288;&ldquo;&#36716;&#21457;&#24341;&#29992;&rdquo;&#65289;&#19988;&#23545;&#24212;&#30340; <code><b>A</b></code>i &#26159;&#24038;&#20540;&#24341;&#29992;&#65292;&#37027;&#20040;&#20250;&#23558; <code><b>P</b></code>i &#35843;&#25972;&#20026;&#27169;&#26495;&#24418;&#21442;&#31867;&#22411;&#65288;T&amp;&amp; &#25104;&#20026; T&#65289;&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx14">
<td>
<p>&#22914;&#26524;&#20989;&#25968;&#27169;&#26495;&#30340;&#36820;&#22238;&#31867;&#22411;&#26159;&#21344;&#20301;&#31526;&#65288;<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">auto</span></span></span> &#25110; <span class="t-c"><span class="mw-geshi cpp source-cpp">decltype<span class="br0">(</span><span class="kw4">auto</span><span class="br0">)</span></span></span>&#65289;&#65292;&#37027;&#20040;&#36820;&#22238;&#31867;&#22411;&#22788;&#20110;&#19981;&#25512;&#23548;&#35821;&#22659;&#65292;&#24182;&#30001;&#23454;&#20363;&#21270;&#20915;&#23450;&#12290;</p>
</td>
<td><span class="t-mark-rev t-since-cxx14">(C++14 &#36215;)</span></td>
</tr>
</table>
<h4><span class="mw-headline" id=".E5.81.8F.E5.BA.8F">&#20559;&#24207;</span></h4>
<p>&#22312;<a href="cpp-language-function_template.html">&#37325;&#36733;&#30340;&#20989;&#25968;&#27169;&#26495;&#30340;&#20559;&#24207;</a>&#36807;&#31243;&#20013;&#20351;&#29992;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#12290;</p>
<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;&#23567;&#31034;&#20363;</td>
</tr>
</table>
<h4><span class="mw-headline" id=".E8.BD.AC.E6.8D.A2.E5.87.BD.E6.95.B0.E6.A8.A1.E6.9D.BF">&#36716;&#25442;&#20989;&#25968;&#27169;&#26495;</span></h4>
<p>&#36873;&#25321;<a href="cpp-language-cast_operator.html">&#29992;&#25143;&#23450;&#20041;&#36716;&#25442;&#20989;&#25968;</a>&#27169;&#26495;&#23454;&#21442;&#26102;&#20351;&#29992;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#12290;</p>
<p><code><b>A</b></code> &#26159;&#35201;&#27714;&#20316;&#20026;&#36716;&#25442;&#32467;&#26524;&#30340;&#31867;&#22411;&#12290; <code><b>P</b></code> &#26159;&#36716;&#25442;&#20989;&#25968;&#27169;&#26495;&#30340;&#36820;&#22238;&#31867;&#22411;&#65292;&#38500;&#20102;</p>
<div class="t-li1"><span class="t-li">a)</span> &#22914;&#26524;&#36820;&#22238;&#31867;&#22411;&#26159;&#24341;&#29992;&#31867;&#22411;&#65292;&#37027;&#20040; <code><b>P</b></code> &#26159;&#34987;&#24341;&#29992;&#31867;&#22411;&#65307;</div>
<div class="t-li1"><span class="t-li">b)</span> &#22914;&#26524;&#36820;&#22238;&#31867;&#22411;&#26159;&#25968;&#32452;&#31867;&#22411;&#19988; <code><b>A</b></code> &#19981;&#26159;&#24341;&#29992;&#31867;&#22411;&#65292;&#37027;&#20040; <code><b>P</b></code> &#26159;&#20174;&#25968;&#32452;&#21040;&#25351;&#38024;&#36716;&#25442;&#33719;&#24471;&#30340;&#25351;&#38024;&#31867;&#22411;&#65307;</div>
<div class="t-li1"><span class="t-li">c)</span> &#22914;&#26524;&#36820;&#22238;&#31867;&#22411;&#26159;&#20989;&#25968;&#31867;&#22411;&#19988; <code><b>A</b></code> &#19981;&#26159;&#24341;&#29992;&#31867;&#22411;&#65292;&#37027;&#20040; <code><b>P</b></code> &#26159;&#20174;&#20989;&#25968;&#21040;&#25351;&#38024;&#36716;&#25442;&#33719;&#24471;&#30340;&#20989;&#25968;&#25351;&#38024;&#31867;&#22411;&#65307;</div>
<div class="t-li1"><span class="t-li">d)</span> &#22914;&#26524; <code><b>P</b></code> &#26377; cv &#38480;&#23450;&#65292;&#37027;&#20040;&#24573;&#30053;&#39030;&#23618; cv &#38480;&#23450;&#31526;&#12290;</div>
<p>&#22914;&#26524; <code><b>A</b></code> &#26377; cv &#38480;&#23450;&#65292;&#37027;&#20040;&#24573;&#30053;&#39030;&#23618; cv &#38480;&#23450;&#31526;&#12290;&#22914;&#26524; <code><b>A</b></code> &#26159;&#24341;&#29992;&#31867;&#22411;&#65292;&#37027;&#20040;&#25512;&#23548;&#20351;&#29992;&#34987;&#24341;&#29992;&#30340;&#31867;&#22411;&#12290;</p>
<p>&#22914;&#26524;&#20174; <code><b>P</b></code> &#21644; <code><b>A</b></code> &#36827;&#34892;&#30340;&#24120;&#35268;&#25512;&#23548;&#65288;&#22914;&#19978;&#25991;&#25152;&#36848;&#65289;&#22833;&#36133;&#65292;&#37027;&#20040;&#32771;&#34385;&#19979;&#21015;&#26367;&#20195;&#26041;&#24335;&#65306;</p>
<div class="t-li1"><span class="t-li">a)</span> &#22914;&#26524; <code><b>A</b></code> &#26159;&#24341;&#29992;&#31867;&#22411;&#65292;&#37027;&#20040; <code><b>A</b></code> &#21487;&#20197;&#27604;&#25512;&#23548;&#20986;&#30340; <code><b>A</b></code> &#26377;&#26356;&#22810;&#30340; cv &#38480;&#23450;&#65307;</div>
<div class="t-li1"><span class="t-li">b)</span> &#22914;&#26524; <code><b>A</b></code> &#26159;&#25351;&#38024;&#25110;&#25104;&#21592;&#25351;&#38024;&#31867;&#22411;&#65292;&#37027;&#20040;&#25512;&#23548;&#20986;&#30340; <code><b>A</b></code> &#21487;&#20197;&#26159;&#20219;&#24847;&#33021;&#20197;&#38480;&#23450;&#36716;&#25442;&#36716;&#25442;&#21040; <code><b>A</b></code> &#30340;&#25351;&#38024;&#65306;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> A <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> operator T<span class="sy2">***</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
A a<span class="sy4">;</span>
<span class="kw4">const</span> <span class="kw4">int</span><span class="sy2">*</span> <span class="kw4">const</span><span class="sy2">*</span> <span class="kw4">const</span><span class="sy2">*</span> p1 <span class="sy1">=</span> a<span class="sy4">;</span> <span class="co1">// P = T***&#65292;A = const int* const* const*</span>
<span class="co1">// &#23545; template&lt;class T&gt; void f(T*** p) &#30340;&#24120;&#35268;&#20989;&#25968;&#35843;&#29992;&#25512;&#23548;</span>
<span class="co1">// &#65288;&#22914;&#21516;&#20197; const int* const* const* &#31867;&#22411;&#30340;&#23454;&#21442;&#36827;&#34892;&#35843;&#29992;&#65289;&#22833;&#36133;</span>
<span class="co1">// &#36716;&#25442;&#20989;&#25968;&#30340;&#39069;&#22806;&#25512;&#23548;&#30830;&#23450; T = int</span>
<span class="co1">// &#65288;&#25512;&#23548;&#20986;&#30340; A &#26159; int***&#65292;&#21487;&#20197;&#36716;&#25442;&#25104; const int* const* const*&#65289;</span></pre></div>
</div>
</div>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx17">
<td>
<div class="t-li1"><span class="t-li">c)</span> &#22914;&#26524; <code><b>A</b></code> &#26159;&#20989;&#25968;&#25351;&#38024;&#31867;&#22411;&#65292;&#37027;&#20040;&#25512;&#23548;&#20986;&#30340; <code><b>A</b></code> &#21487;&#20197;&#26159;&#25351;&#21521; noexcept &#20989;&#25968;&#30340;&#25351;&#38024;&#65292;&#24182;&#21487;&#20197;&#36890;&#36807;&#20989;&#25968;&#25351;&#38024;&#36716;&#25442;&#36716;&#25442;&#25104; <code><b>A</b></code>&#65307;</div>
<div class="t-li1"><span class="t-li">d)</span> &#22914;&#26524; <code><b>A</b></code> &#26159;&#25104;&#21592;&#20989;&#25968;&#25351;&#38024;&#65292;&#37027;&#20040;&#25512;&#23548;&#20986;&#30340; <code><b>A</b></code> &#21487;&#20197;&#26159;&#25351;&#21521; noexcept &#25104;&#21592;&#20989;&#25968;&#30340;&#25351;&#38024;&#65292;&#24182;&#21487;&#20197;&#36890;&#36807;&#20989;&#25968;&#25351;&#38024;&#36716;&#25442;&#36716;&#25442;&#25104; <code><b>A</b></code>&#12290;</div>
</td>
<td><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></td>
</tr>
</table>
<p>&#20851;&#20110;&#36716;&#25442;&#20989;&#25968;&#27169;&#26495;&#30340;&#20854;&#20182;&#35268;&#21017;&#65292;&#35265;<a href="cpp-language-member_template.html#.E8.BD.AC.E6.8D.A2.E5.87.BD.E6.95.B0.E6.A8.A1.E6.9D.BF">&#25104;&#21592;&#27169;&#26495;</a>&#12290;</p>
<h4><span class="mw-headline" id=".E6.98.BE.E5.BC.8F.E5.AE.9E.E4.BE.8B.E5.8C.96">&#26174;&#24335;&#23454;&#20363;&#21270;</span></h4>
<p><a href="cpp-language-function_template.html#.E6.98.BE.E5.BC.8F.E5.AE.9E.E4.BE.8B.E5.8C.96">&#26174;&#24335;&#23454;&#20363;&#21270;</a>&#12289;<a href="cpp-language-template_specialization.html">&#26174;&#24335;&#29305;&#21270;</a> &#20197;&#21450;&#22768;&#26126;&#31526;&#26631;&#35782;&#24688;&#22909;&#25351;&#20195;&#26576;&#20010;&#20989;&#25968;&#27169;&#26495;&#29305;&#21270;&#30340;<a href="cpp-language-friend.html#.E6.A8.A1.E6.9D.BF.E5.8F.8B.E5.85.83">&#21451;&#20803;&#22768;&#26126;</a>&#65288;&#20363;&#22914; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">friend</span> ostream<span class="sy3">&amp;</span> operator<span class="sy1">&lt;&lt;</span> <span class="sy1">&lt;&gt;</span> <span class="br0">(</span>...<span class="br0">)</span></span></span>&#65289;&#22312;&#36824;&#26377;&#27169;&#26495;&#23454;&#21442;&#27809;&#26377;&#34987;&#26174;&#24335;&#25351;&#23450;&#19988;&#27809;&#26377;&#40664;&#35748;&#20540;&#26102;&#20250;&#29992;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#26469;&#30830;&#23450;&#25351;&#20195;&#21738;&#20010;&#27169;&#26495;&#29305;&#21270;&#12290;</p>
<p><code><b>P</b></code> &#26159;&#34987;&#35748;&#20026;&#26159;&#28508;&#22312;&#21305;&#37197;&#30340;&#20989;&#25968;&#27169;&#26495;&#30340;&#31867;&#22411;&#65292;&#32780; <code><b>A</b></code> &#26159;&#22768;&#26126;&#20013;&#30340;&#20989;&#25968;&#31867;&#22411;&#12290;&#22914;&#26524;&#65288;&#20559;&#24207;&#21518;&#65289;&#27809;&#26377;&#21305;&#37197;&#25110;&#22810;&#20110;&#19968;&#20010;&#21305;&#37197;&#65292;&#37027;&#20040;&#20989;&#25968;&#22768;&#26126;&#20026;&#35884;&#26500;&#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> X<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span>X a<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#31532; 1 &#20010;&#27169;&#26495; f</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> X<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span>X<span class="sy2">*</span> a<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#31532; 2 &#20010;&#27169;&#26495; f</span>
<span class="kw1">template</span><span class="sy1">&lt;&gt;</span> <span class="kw4">void</span> f<span class="sy1">&lt;&gt;</span><span class="br0">(</span><span class="kw4">int</span><span class="sy2">*</span> a<span class="br0">)</span> <span class="br0">{</span> <span class="br0">}</span> <span class="co1">// f &#30340;&#26174;&#24335;&#29305;&#21270;</span>
<span class="co1">// P1 = void(X)&#65292; A1 = void(int*)&#65306;&#25512;&#23548;&#20986; X = int*&#65292;f&lt;int*&gt;(int*)</span>
<span class="co1">// P2 = void(X*)&#65292;A2 = void(int*)&#65306;&#25512;&#23548;&#20986; X = int&#65292; f&lt;int&gt;(int*)</span>
<span class="co1">// &#21521;&#20559;&#24207;&#25552;&#20132; f&lt;int*&gt;(int*) &#19982; f&lt;int&gt;(int*)</span>
<span class="co1">// &#23427;&#36873;&#25321; f&lt;int&gt;(int*) &#20026;&#26356;&#29305;&#27530;&#30340;&#27169;&#26495;</span></pre></div>
</div>
<p>&#36825;&#31181;&#24773;&#20917;&#19979;&#30340;&#25512;&#23548;&#36866;&#29992;&#19968;&#26465;&#39069;&#22806;&#30340;&#35268;&#21017;&#65306;&#24403;&#27604;&#36739;&#20989;&#25968;&#24418;&#21442; <code><b>P</b></code>i &#21644; <code><b>A</b></code>i &#26102;&#65292;&#22914;&#26524;&#26377;&#20219;&#20309; <code><b>P</b></code>i &#26159;&#21040;&#26080; cv &#38480;&#23450;&#27169;&#26495;&#24418;&#21442;&#30340;&#21491;&#20540;&#24341;&#29992;&#65288;&ldquo;&#36716;&#21457;&#24341;&#29992;&rdquo;&#65289;&#19988;&#23545;&#24212;&#30340; <code><b>A</b></code>i &#26159;&#24038;&#20540;&#24341;&#29992;&#65292;&#37027;&#20040;&#23558; <code><b>P</b></code>i &#35843;&#25972;&#20026;&#27169;&#26495;&#24418;&#21442;&#31867;&#22411;&#65288;T&amp;&amp; &#25104;&#20026; T&#65289;&#12290;</p>
<h4><span class="mw-headline" id=".E8.A7.A3.E5.88.86.E9.85.8D.E5.87.BD.E6.95.B0.E6.A8.A1.E6.9D.BF">&#35299;&#20998;&#37197;&#20989;&#25968;&#27169;&#26495;</span></h4>
<p>&#30830;&#23450;<a href="cpp-memory-new-operator_delete.html">&#35299;&#20998;&#37197;&#20989;&#25968;</a>&#27169;&#26495;&#29305;&#21270;&#26159;&#21542;&#19982;&#32473;&#23450;&#30340; <code>operator new</code> &#24067;&#32622;&#24418;&#24335;&#30456;&#21305;&#37197;&#26102;&#20351;&#29992;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#12290;</p>
<p><code><b>P</b></code> &#26159;&#34987;&#35748;&#20026;&#26159;&#28508;&#22312;&#21305;&#37197;&#30340;&#20989;&#25968;&#27169;&#26495;&#30340;&#31867;&#22411;&#65292;&#32780; <code><b>A</b></code> &#26159;&#24212;&#24403;&#19982;&#32771;&#34385;&#20013;&#30340;&#24067;&#32622; operator new &#30456;&#21305;&#37197;&#30340;&#35299;&#20998;&#37197;&#20989;&#25968;&#30340;&#20989;&#25968;&#31867;&#22411;&#12290;&#22914;&#26524;&#65288;&#22312;&#37325;&#36733;&#20915;&#35758;&#21518;&#65289;&#27809;&#26377;&#21305;&#37197;&#25110;&#22810;&#20110;&#19968;&#20010;&#21305;&#37197;&#65292;&#37027;&#20040;&#19981;&#35843;&#29992;&#24067;&#32622;&#35299;&#20998;&#37197;&#20989;&#25968;&#65288;&#21487;&#33021;&#21457;&#29983;&#20869;&#23384;&#27844;&#28431;&#65289;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> X
<span class="br0">{</span>
X<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">throw</span> <a href="cpp-error-runtime_error.html"><span class="kw770">std::<span class="me2">runtime_error</span></span></a><span class="br0">(</span><span class="st0">&quot;&quot;</span><span class="br0">)</span><span class="sy4">;</span> <span class="br0">}</span>
<span class="kw4">static</span> <span class="kw4">void</span><span class="sy2">*</span> <a href="cpp-memory-new-operator_new.html"><span class="kw687">operator new</span></a><span class="br0">(</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> sz, <span class="kw4">bool</span> b<span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="sy4">::</span><a href="cpp-memory-new-operator_new.html"><span class="kw687">operator new</span></a><span class="br0">(</span>sz<span class="br0">)</span><span class="sy4">;</span> <span class="br0">}</span>
<span class="kw4">static</span> <span class="kw4">void</span><span class="sy2">*</span> <a href="cpp-memory-new-operator_new.html"><span class="kw687">operator new</span></a><span class="br0">(</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> sz, <span class="kw4">double</span> f<span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="sy4">::</span><a href="cpp-memory-new-operator_new.html"><span class="kw687">operator new</span></a><span class="br0">(</span>sz<span class="br0">)</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> <span class="kw4">static</span> <span class="kw4">void</span> <a href="cpp-memory-new-operator_delete.html"><span class="kw689">operator delete</span></a><span class="br0">(</span><span class="kw4">void</span><span class="sy2">*</span> ptr, T arg<span class="br0">)</span>
<span class="br0">{</span>
<span class="sy4">::</span><a href="cpp-memory-new-operator_delete.html"><span class="kw689">operator delete</span></a><span class="br0">(</span>ptr<span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="kw1">try</span>
<span class="br0">{</span>
X<span class="sy2">*</span> p1 <span class="sy1">=</span> new <span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span> X<span class="sy4">;</span> <span class="co1">// &#24403; X() &#25243;&#20986;&#24322;&#24120;&#26102;&#65292;&#26597;&#25214; operator delete</span>
<span class="co1">// P1 = void(void*, T)&#65292;A1 = void(void*, bool)&#65306;</span>
<span class="co1">// &#25512;&#23548;&#20986; T = bool</span>
<span class="co1">// P2 = void(void*, T)&#65292;A2 = void(void*, double)&#65306;</span>
<span class="co1">// &#25512;&#23548;&#20986; T = double</span>
<span class="co1">// &#37325;&#36733;&#20915;&#35758;&#25361;&#36873; operator delete&lt;bool&gt;</span>
<span class="br0">}</span> <span class="kw1">catch</span><span class="br0">(</span><span class="kw4">const</span> <a href="cpp-error-exception.html"><span class="kw764">std::<span class="me2">exception</span></span></a><span class="sy3">&amp;</span><span class="br0">)</span> <span class="br0">{</span> <span class="br0">}</span>
<span class="kw1">try</span>
<span class="br0">{</span>
X<span class="sy2">*</span> p1 <span class="sy1">=</span> new <span class="br0">(</span><span class="nu16">13.2</span><span class="br0">)</span> X<span class="sy4">;</span> <span class="co1">// &#21516;&#26679;&#30340;&#26597;&#25214;&#65292;&#25361;&#36873; operator delete&lt;double&gt;</span>
<span class="br0">}</span> <span class="kw1">catch</span><span class="br0">(</span><span class="kw4">const</span> <a href="cpp-error-exception.html"><span class="kw764">std::<span class="me2">exception</span></span></a><span class="sy3">&amp;</span><span class="br0">)</span> <span class="br0">{</span> <span class="br0">}</span>
<span class="br0">}</span></pre></div>
</div>
<h3><span class="mw-headline" id=".E5.88.AB.E5.90.8D.E6.A8.A1.E7.89.88">&#21035;&#21517;&#27169;&#29256;</span></h3>
<p><a href="cpp-language-type_alias.html">&#21035;&#21517;&#27169;&#29256;</a>&#22987;&#32456;&#19981;&#20250;&#36827;&#34892;&#25512;&#23548;&#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> <span class="kw1">struct</span> Alloc <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">class</span> T<span class="sy1">&gt;</span> <span class="kw1">using</span> Vec <span class="sy1">=</span> vector<span class="sy1">&lt;</span>T, Alloc<span class="sy1">&lt;</span>T<span class="sy1">&gt;&gt;</span><span class="sy4">;</span>
Vec<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> v<span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span>, <span class="kw1">class</span><span class="sy1">&gt;</span> <span class="kw1">class</span> TT<span class="sy1">&gt;</span> <span class="kw4">void</span> g<span class="br0">(</span>TT<span class="sy1">&lt;</span><span class="kw4">int</span>, Alloc<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;&gt;</span><span class="br0">)</span><span class="sy4">;</span>
g<span class="br0">(</span>v<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#25512;&#23548;&#20986; TT = vector</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span><span class="sy1">&gt;</span> <span class="kw1">class</span> TT<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span>TT<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span><span class="br0">)</span><span class="sy4">;</span>
f<span class="br0">(</span>v<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306; TT &#26080;&#27861;&#34987;&#25512;&#23548;&#20026; &quot;Vec&quot;&#65292;&#22240;&#20026; Vec &#26159;&#21035;&#21517;&#27169;&#29256;</span></pre></div>
</div>
<h3><span class="mw-headline" id=".E9.9A.90.E5.BC.8F.E8.BD.AC.E6.8D.A2">&#38544;&#24335;&#36716;&#25442;</span></h3>
<p>&#31867;&#22411;&#25512;&#23548;&#19981;&#20250;&#32771;&#34385;&#65288;&#38500;&#20102;&#20197;&#19978;&#21015;&#20986;&#30340;&#31867;&#22411;&#35843;&#25972;&#20043;&#22806;&#30340;&#65289;&#38544;&#24335;&#36716;&#25442;&#65306;&#36825;&#26159;&#20854;&#21518;&#36827;&#34892;&#30340;<a href="cpp-language-overload_resolution.html">&#37325;&#36733;&#20915;&#35758;</a>&#30340;&#24037;&#20316;&#12290;&#28982;&#32780;&#65292;&#22914;&#26524;&#23545;&#25152;&#26377;&#21442;&#19982;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#30340;&#24418;&#21442;&#36827;&#34892;&#30340;&#25512;&#23548;&#22343;&#25104;&#21151;&#65292;&#24182;&#19988;&#25152;&#26377;&#19981;&#25512;&#23548;&#30340;&#27169;&#26495;&#23454;&#21442;&#22343;&#34987;&#26174;&#24335;&#25351;&#23450;&#25110;&#26377;&#40664;&#35748;&#20540;&#65292;&#37027;&#20040;&#23558;&#21097;&#20313;&#30340;&#21508;&#20989;&#25968;&#24418;&#21442;&#19982;&#23545;&#24212;&#30340;&#20989;&#25968;&#23454;&#21442;&#27604;&#36739;&#12290;&#23545;&#20110;&#20855;&#26377;&#22312;&#26367;&#25442;&#20219;&#20309;&#26174;&#24335;&#25351;&#23450;&#30340;&#27169;&#26495;&#23454;&#21442;&#20043;&#21069;&#26410;&#24453;&#20915;&#30340;&#31867;&#22411;&#30340;&#27599;&#20010;&#21097;&#20313;&#24418;&#21442; <code><b>P</b></code>&#65292;&#22914;&#26524;&#23545;&#24212;&#30340;&#23454;&#21442; <code><b>A</b></code> &#26080;&#27861;&#38544;&#24335;&#36716;&#25442;&#25104; <code><b>P</b></code>&#65292;&#37027;&#20040;&#25512;&#23548;&#22833;&#36133;&#12290;</p>
<p>&#20854;&#20013;&#27809;&#26377;&#27169;&#26495;&#24418;&#21442;&#20250;&#21442;&#19982;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;&#30340;&#20855;&#26377;&#24453;&#20915;&#31867;&#22411;&#30340;&#24418;&#21442;&#65292;&#20197;&#21450;&#30001;&#20110;&#26367;&#25442;&#26174;&#24335;&#25351;&#23450;&#30340;&#27169;&#26495;&#23454;&#21442;&#32780;&#25104;&#20026;&#38750;&#24453;&#20915;&#30340;&#24418;&#21442;&#65292;&#23558;&#22312;&#37325;&#36733;&#20915;&#35758;&#26399;&#38388;&#26816;&#26597;&#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> <span class="kw1">struct</span> Z <span class="br0">{</span> <span class="kw1">typedef</span> <span class="kw1">typename</span> T<span class="sy4">::</span><span class="me2">x</span> xx<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">class</span> T<span class="sy1">&gt;</span> <span class="kw1">typename</span> Z<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">xx</span> f<span class="br0">(</span><span class="kw4">void</span><span class="sy2">*</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><span class="kw1">class</span> T<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">int</span>, T<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #2</span>
<span class="kw1">struct</span> A <span class="br0">{</span> <span class="br0">}</span> a<span class="sy4">;</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="nu0">1</span>, a<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#23545;&#20110; #1&#65292;&#25512;&#23548;&#30830;&#23450; T = struct A&#65292;&#20294;&#21097;&#20313;&#23454;&#21442; 1</span>
<span class="co1">// &#19981;&#33021;&#38544;&#24335;&#36716;&#25442;&#25104;&#20854;&#24418;&#21442; void*&#65306;&#25512;&#23548;&#22833;&#36133;</span>
<span class="co1">// &#19981;&#35201;&#27714;&#36820;&#22238;&#31867;&#22411;&#30340;&#23454;&#20363;&#21270;</span>
<span class="co1">// &#23545;&#20110; #2&#65292;&#25512;&#23548;&#30830;&#23450; T = struct A&#65292;&#19988;&#21097;&#20313;&#23454;&#21442; 1</span>
<span class="co1">// &#33021;&#38544;&#24335;&#36716;&#25442;&#25104;&#20854;&#24418;&#21442; int&#65306;&#25512;&#23548;&#25104;&#21151;</span>
<span class="co1">// &#20989;&#25968;&#35843;&#29992;&#32534;&#35793;&#20026;&#21040; #2 &#30340;&#35843;&#29992;&#65288;&#25512;&#23548;&#22833;&#36133;&#26159; SFINAE&#65289;</span>
<span class="br0">}</span></pre></div>
</div>
<h3><span class="mw-headline" id=".E7.BC.BA.E9.99.B7.E6.8A.A5.E5.91.8A">&#32570;&#38519;&#25253;&#21578;</span></h3>
<p>&#19979;&#21015;&#26356;&#25913;&#34892;&#20026;&#30340;&#32570;&#38519;&#25253;&#21578;&#36861;&#28335;&#22320;&#24212;&#29992;&#20110;&#20197;&#21069;&#20986;&#29256;&#30340; C++ &#26631;&#20934;&#12290;</p>
<table class="dsctable" style="font-size:0.8em">
<tr>
<th>DR</th>
<th>&#24212;&#29992;&#20110;</th>
<th>&#20986;&#29256;&#26102;&#30340;&#34892;&#20026;</th>
<th>&#27491;&#30830;&#34892;&#20026;</th>
</tr>
<tr>
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue70">CWG 70</a></td>
<td>C++98</td>
<td>&#26410;&#25351;&#26126;&#25968;&#32452;&#36793;&#30028;&#26159;&#21542;&#20250;&#34987;&#25512;&#23548;</td>
<td>&#25351;&#23450;&#20026;&#19981;&#25512;&#23548;</td>
</tr>
<tr>
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue1391">CWG 1391</a></td>
<td>C++98</td>
<td>&#26410;&#25351;&#26126;&#25512;&#23548;&#25152;&#19981;&#28041;&#21450;&#30340;&#23454;&#21442;&#38544;&#24335;&#36716;&#25442;&#30340;&#25928;&#26524;</td>
<td>&#25351;&#23450;&#20026;&#22914;&#19978;&#25991;&#25152;&#36848;</td>
</tr>
<tr>
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue1591">CWG 1591</a></td>
<td>C++11</td>
<td>&#19981;&#33021;&#20174; <i>&#33457;&#25324;&#21495;&#21021;&#22987;&#21270;&#22120;&#21015;&#34920;</i> &#25512;&#23548;&#25968;&#32452;&#36793;&#30028;&#21644;&#20803;&#32032;&#31867;&#22411;</td>
<td>&#20801;&#35768;&#25512;&#23548;</td>
</tr>
<tr>
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue2052">CWG 2052</a></td>
<td>C++98</td>
<td>&#20197;&#38750;&#31867;&#38750;&#26522;&#20030;&#23454;&#21442;&#25512;&#23548;&#36816;&#31639;&#31526;&#26159;&#30828;&#38169;&#35823;</td>
<td>&#33509;&#26377;&#20854;&#20182;&#37325;&#36733;&#21017;&#20026;&#36719;&#38169;&#35823;</td>
</tr>
<tr>
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue2091">CWG 2091</a></td>
<td>C++98</td>
<td>&#25512;&#23548;&#24341;&#29992;&#38750;&#31867;&#22411;&#24418;&#21442;&#19981;&#21487;&#29992;&#65292;&#22240;&#20026;&#31867;&#22411;&#19981;&#33021;&#21305;&#37197;&#23454;&#21442;</td>
<td>&#36991;&#20813;&#31867;&#22411;&#19981;&#21305;&#37197;</td>
</tr>
<tr>
<td><a rel="nofollow" class="external text" href="https://wg21.link/N3922">N3922</a></td>
<td>C++11</td>
<td><code>auto</code> &#30340;&#30452;&#25509;&#21015;&#34920;&#21021;&#22987;&#21270;&#25512;&#23548;&#20986; <span class="t-lc"><a href="cpp-utility-initializer_list.html">std::initializer_list</a></span></td>
<td>&#23545;&#22810;&#20110;&#19968;&#20010;&#20803;&#32032;&#20026;&#35884;&#26500;&#65292;&#23545;&#21333;&#20010;&#20803;&#32032;&#25512;&#23548;&#20986;&#20803;&#32032;&#31867;&#22411;</td>
</tr>
</table>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>