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

127 lines
12 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>explicit &#35828;&#26126;&#31526;</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_explicit skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading">explicit &#35828;&#26126;&#31526;</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">
<table class="t-sdsc-begin">
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><code><b>explicit</b></code></td>
<td>(1)</td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><code><b>explicit (</b></code> <span class="t-spar">&#34920;&#36798;&#24335;</span> <code><b>)</b></code></td>
<td>(2)</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
</table>
<table class="t-par-begin">
<tr class="t-par">
<td><span class="t-spar">&#34920;&#36798;&#24335;</span></td>
<td>-</td>
<td><a href="cpp-language-constant_expression.html#.E7.BB.8F.E8.BD.AC.E6.8D.A2.E7.9A.84.E5.B8.B8.E9.87.8F.E8.A1.A8.E8.BE.BE.E5.BC.8F">&#32463;&#25353;&#35821;&#22659;&#36716;&#25442;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span> &#31867;&#22411;&#30340;&#24120;&#37327;&#34920;&#36798;&#24335;</a></td>
</tr>
</table>
<div class="t-li1"><span class="t-li">1)</span> &#25351;&#23450;&#26500;&#36896;&#20989;&#25968;<span class="t-rev-inl t-since-cxx11"><span>&#25110;&#36716;&#25442;&#20989;&#25968;</span> <span><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></span></span><span class="t-rev-inl t-since-cxx17"><span>&#25110;<a href="cpp-language-class_template_argument_deduction.html">&#25512;&#23548;&#25351;&#24341;</a></span> <span><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></span></span>&#20026;&#26174;&#24335;&#65292;&#21363;&#23427;&#19981;&#33021;&#29992;&#20110;<a href="cpp-language-implicit_conversion.html">&#38544;&#24335;&#36716;&#25442;</a>&#21644;<a href="cpp-language-copy_initialization.html">&#22797;&#21046;&#21021;&#22987;&#21270;</a>&#12290;</div>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx20">
<td>
<div class="t-li1"><span class="t-li">2)</span> <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">explicit</span></span></span> &#35828;&#26126;&#31526;&#21487;&#20197;&#19982;&#24120;&#37327;&#34920;&#36798;&#24335;&#19968;&#21516;&#20351;&#29992;&#12290;&#20989;&#25968;&#22312;&#19988;&#21482;&#20250;&#22312;&#35813;&#24120;&#37327;&#34920;&#36798;&#24335;&#27714;&#20540;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> &#26102;&#26159;&#26174;&#24335;&#30340;&#12290;</div>
</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
</table>
<p>explicit &#35828;&#26126;&#31526;&#21482;&#33021;&#22312;&#31867;&#23450;&#20041;&#20043;&#20869;&#30340;&#26500;&#36896;&#20989;&#25968;<span class="t-rev-inl t-since-cxx11"><span>&#25110;&#36716;&#25442;&#20989;&#25968;</span> <span><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></span></span>&#30340; <span class="t-spar">&#22768;&#26126;&#35828;&#26126;&#31526;&#24207;&#21015;</span> &#20013;&#20986;&#29616;&#12290;</p>
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">&#27880;&#35299;</span></h3>
<p>&#22768;&#26126;&#26102;&#19981;&#24102;&#20989;&#25968;&#35828;&#26126;&#31526; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">explicit</span></span></span> &#30340;<span class="t-rev-inl t-until-cxx11"><span>&#25317;&#26377;&#21333;&#20010;&#26080;&#40664;&#35748;&#20540;&#24418;&#21442;&#30340;</span> <span><span class="t-mark-rev t-until-cxx11">(C++11 &#21069;)</span></span></span>&#26500;&#36896;&#20989;&#25968;&#34987;&#31216;&#20316;<a href="cpp-language-converting_constructor.html">&#36716;&#25442;&#26500;&#36896;&#20989;&#25968;</a>&#12290;</p>
<p>&#26500;&#36896;&#20989;&#25968;&#65288;&#38500;&#20102;<a href="cpp-language-copy_constructor.html">&#22797;&#21046;</a>&#25110;<a href="cpp-language-move_constructor.html">&#31227;&#21160;</a>&#65289;&#21644;&#29992;&#25143;&#23450;&#20041;&#36716;&#25442;&#20989;&#25968;&#37117;&#21487;&#20197;&#26159;&#20989;&#25968;&#27169;&#26495;&#65307;<code>explicit</code> &#30340;&#21547;&#20041;&#19981;&#21464;&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx20">
<td>
<p>&#36319;&#38543; <code>explicit</code> &#30340; <code>(</code> &#35760;&#21495;&#34987;&#35299;&#26512;&#25104; explicit &#25351;&#23450;&#31526;&#30340;&#19968;&#37096;&#20998;&#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> S <span class="br0">{</span>
<span class="kw1">explicit</span> <span class="br0">(</span>S<span class="br0">)</span><span class="br0">(</span><span class="kw4">const</span> S<span class="sy3">&amp;</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// C++20 &#20013;&#38169;&#35823;&#65292;C++17 &#20013; OK</span>
<span class="kw1">explicit</span> <span class="br0">(</span>operator <span class="kw4">int</span><span class="br0">)</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// C++20 &#20013;&#38169;&#35823;&#65292;C++17 &#20013; OK</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
</table>
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">&#31034;&#20363;</span></h3>
<div class="t-example">
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> A
<span class="br0">{</span>
A<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span> <span class="br0">{</span> <span class="br0">}</span> <span class="co1">// &#36716;&#25442;&#26500;&#36896;&#20989;&#25968;</span>
A<span class="br0">(</span><span class="kw4">int</span>, <span class="kw4">int</span><span class="br0">)</span> <span class="br0">{</span> <span class="br0">}</span> <span class="co1">// &#36716;&#25442;&#26500;&#36896;&#20989;&#25968;&#65288;C++11&#65289;</span>
operator <span class="kw4">bool</span><span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> B
<span class="br0">{</span>
<span class="kw1">explicit</span> B<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span> <span class="br0">{</span> <span class="br0">}</span>
<span class="kw1">explicit</span> B<span class="br0">(</span><span class="kw4">int</span>, <span class="kw4">int</span><span class="br0">)</span> <span class="br0">{</span> <span class="br0">}</span>
<span class="kw1">explicit</span> operator <span class="kw4">bool</span><span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
A a1 <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#22797;&#21046;&#21021;&#22987;&#21270;&#36873;&#25321; A::A(int)</span>
A a2<span class="br0">(</span><span class="nu0">2</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#30452;&#25509;&#21021;&#22987;&#21270;&#36873;&#25321; A::A(int)</span>
A a3 <span class="br0">{</span><span class="nu0">4</span>, <span class="nu0">5</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#30452;&#25509;&#21015;&#34920;&#21021;&#22987;&#21270;&#36873;&#25321; A::A(int, int)</span>
A a4 <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">4</span>, <span class="nu0">5</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#22797;&#21046;&#21015;&#34920;&#21021;&#22987;&#21270;&#36873;&#25321; A::A(int, int)</span>
A a5 <span class="sy1">=</span> <span class="br0">(</span>A<span class="br0">)</span><span class="nu0">1</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#26174;&#24335;&#36716;&#22411;&#36827;&#34892; static_cast</span>
<span class="kw1">if</span> <span class="br0">(</span>a1<span class="br0">)</span> <span class="sy4">;</span> <span class="co1">// OK&#65306;A::operator bool()</span>
<span class="kw4">bool</span> na1 <span class="sy1">=</span> a1<span class="sy4">;</span> <span class="co1">// OK&#65306;&#22797;&#21046;&#21021;&#22987;&#21270;&#36873;&#25321; A::operator bool()</span>
<span class="kw4">bool</span> na2 <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1">&lt;</span><span class="kw4">bool</span><span class="sy1">&gt;</span><span class="br0">(</span>a1<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;static_cast &#36827;&#34892;&#30452;&#25509;&#21021;&#22987;&#21270;</span>
<span class="co1">// B b1 = 1; // &#38169;&#35823;&#65306;&#22797;&#21046;&#21021;&#22987;&#21270;&#19981;&#32771;&#34385; B::B(int)</span>
B b2<span class="br0">(</span><span class="nu0">2</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#30452;&#25509;&#21021;&#22987;&#21270;&#36873;&#25321; B::B(int)</span>
B b3 <span class="br0">{</span><span class="nu0">4</span>, <span class="nu0">5</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#30452;&#25509;&#21015;&#34920;&#21021;&#22987;&#21270;&#36873;&#25321; B::B(int, int)</span>
<span class="co1">// B b4 = {4, 5}; // &#38169;&#35823;&#65306;&#22797;&#21046;&#21015;&#34920;&#21021;&#22987;&#21270;&#19981;&#32771;&#34385; B::B(int,int)</span>
B b5 <span class="sy1">=</span> <span class="br0">(</span>B<span class="br0">)</span><span class="nu0">1</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#26174;&#24335;&#36716;&#22411;&#36827;&#34892; static_cast</span>
<span class="kw1">if</span> <span class="br0">(</span>b2<span class="br0">)</span> <span class="sy4">;</span> <span class="co1">// OK&#65306;B::operator bool()</span>
<span class="co1">// bool nb1 = b2; // &#38169;&#35823;&#65306;&#22797;&#21046;&#21021;&#22987;&#21270;&#19981;&#32771;&#34385; B::operator bool()</span>
<span class="kw4">bool</span> nb2 <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1">&lt;</span><span class="kw4">bool</span><span class="sy1">&gt;</span><span class="br0">(</span>b2<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;static_cast &#36827;&#34892;&#30452;&#25509;&#21021;&#22987;&#21270;</span>
<span class="br0">}</span></pre></div>
</div>
</div>
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">&#21442;&#38405;</span></h3>
<ul>
<li><a href="cpp-language-converting_constructor.html">&#36716;&#25442;&#26500;&#36896;&#20989;&#25968;</a></li>
<li><a href="cpp-language-initialization.html">&#21021;&#22987;&#21270;</a></li>
<li><a href="cpp-language-copy_initialization.html">&#22797;&#21046;&#21021;&#22987;&#21270;</a></li>
<li><a href="cpp-language-direct_initialization.html">&#30452;&#25509;&#21021;&#22987;&#21270;</a></li>
</ul>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>