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

312 lines
36 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>&#32852;&#21512;&#20307;&#22768;&#26126;</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_union skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading">&#32852;&#21512;&#20307;&#22768;&#26126;</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>&#32852;&#21512;&#20307;&#26159;&#29305;&#27530;&#30340;&#31867;&#31867;&#22411;&#65292;&#23427;&#22312;&#19968;&#20010;&#26102;&#21051;&#21482;&#33021;&#20445;&#26377;&#20854;&#19968;&#20010;&#38750;&#38745;&#24577;<a href="cpp-language-data_members.html">&#25968;&#25454;&#25104;&#21592;</a>&#12290;</p>
<p>&#32852;&#21512;&#20307;&#22768;&#26126;&#30340;&#31867;&#35828;&#26126;&#31526;&#19982;<a href="cpp-language-class.html">&#31867;&#25110;&#32467;&#26500;&#20307;</a>&#30340;&#22768;&#26126;&#30456;&#20284;&#65306;</p>
<table class="t-sdsc-begin">
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td class="t-sdsc-nopad"><code><b>union</b></code> <span class="t-spar">&#23646;&#24615;</span> <span class="t-spar">&#31867;&#22836;&#21517;</span> <code><b>{</b></code> <span class="t-spar">&#25104;&#21592;&#35828;&#26126;</span> <code><b>}</b></code></td>
<td class="t-sdsc-nopad"></td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
</table>
<table class="t-par-begin">
<tr class="t-par">
<td><span class="t-spar">&#23646;&#24615;</span></td>
<td>-</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span> &#20219;&#24847;&#25968;&#37327;<a href="cpp-language-attributes.html">&#23646;&#24615;</a>&#30340;&#21487;&#36873;&#24207;&#21015;</td>
</tr>
<tr class="t-par">
<td><span class="t-spar">&#31867;&#22836;&#21517;</span></td>
<td>-</td>
<td>&#34987;&#23450;&#20041;&#30340;&#32852;&#21512;&#20307;&#30340;&#21517;&#23383;&#12290;&#21487;&#20197;&#21069;&#38468; <span class="t-spar">&#23884;&#22871;&#21517;&#35828;&#26126;&#31526;</span>&#65288;&#21517;&#23383;&#19982;&#20316;&#29992;&#22495;&#35299;&#26512;&#36816;&#31639;&#31526;&#30340;&#24207;&#21015;&#65292;&#20197;&#20316;&#29992;&#22495;&#35299;&#26512;&#36816;&#31639;&#31526;&#32467;&#23614;&#65289;&#12290;&#21487;&#20197;&#24573;&#30053;&#21517;&#23383;&#65292;&#27492;&#26102;&#32852;&#21512;&#20307;&#26159;<i>&#26080;&#21517;</i>&#30340;</td>
</tr>
<tr class="t-par">
<td><span class="t-spar">&#25104;&#21592;&#35828;&#26126;</span></td>
<td>-</td>
<td>&#35775;&#38382;&#35828;&#26126;&#31526;&#12289;&#25104;&#21592;&#23545;&#35937;&#21644;&#25104;&#21592;&#20989;&#25968;&#30340;&#22768;&#26126;&#19982;&#23450;&#20041;&#30340;&#21015;&#34920;&#12290;</td>
</tr>
</table>
<p>&#32852;&#21512;&#20307;&#21487;&#20197;&#25317;&#26377;&#25104;&#21592;&#20989;&#25968;&#65288;&#21253;&#21547;&#26500;&#36896;&#20989;&#25968;&#21644;&#26512;&#26500;&#20989;&#25968;&#65289;&#65292;&#20294;&#19981;&#33021;&#26377;&#34394;&#20989;&#25968;&#12290;</p>
<p>&#32852;&#21512;&#20307;&#19981;&#33021;&#26377;&#22522;&#31867;&#19988;&#19981;&#33021;&#29992;&#20316;&#22522;&#31867;&#12290;</p>
<p>&#32852;&#21512;&#20307;&#19981;&#33021;&#25317;&#26377;&#24341;&#29992;&#31867;&#22411;&#30340;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-until-cxx11">
<td>
<p>&#32852;&#21512;&#20307;&#19981;&#33021;&#21547;&#26377;&#24102;&#38750;&#24179;&#20961;&#29305;&#27530;&#25104;&#21592;&#20989;&#25968;&#65288;<a href="cpp-language-copy_constructor.html">&#22797;&#21046;&#26500;&#36896;&#20989;&#25968;</a>&#12289;<a href="cpp-language-copy_assignment.html">&#22797;&#21046;&#36171;&#20540;</a>&#36816;&#31639;&#31526;&#25110;<a href="cpp-language-destructor.html">&#26512;&#26500;&#20989;&#25968;</a>&#65289;&#30340;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#12290;</p>
</td>
<td><span class="t-mark-rev t-until-cxx11">(C++11 &#21069;)</span></td>
</tr>
<tr class="t-rev t-since-cxx11">
<td>
<p>&#22914;&#26524;&#32852;&#21512;&#20307;&#21547;&#26377;&#24102;&#38750;&#24179;&#20961;&#29305;&#27530;&#25104;&#21592;&#20989;&#25968;&#65288;<a href="cpp-language-copy_constructor.html">&#22797;&#21046;</a>/<a href="cpp-language-move_constructor.html">&#31227;&#21160;</a>&#26500;&#36896;&#20989;&#25968;&#65292;<a href="cpp-language-copy_assignment.html">&#22797;&#21046;</a>/<a href="cpp-language-move_assignment.html">&#31227;&#21160;</a>&#36171;&#20540;&#65292;&#25110;<a href="cpp-language-destructor.html">&#26512;&#26500;&#20989;&#25968;</a>&#65289;&#30340;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#65292;&#37027;&#20040;&#35813;&#32852;&#21512;&#20307;&#20013;&#30340;&#37027;&#20123;&#20989;&#25968;&#40664;&#35748;&#34987;&#24323;&#32622;&#65292;&#19988;&#38656;&#35201;&#31243;&#24207;&#21592;&#26174;&#24335;&#23450;&#20041;&#12290;</p>
<p>&#22914;&#26524;&#32852;&#21512;&#20307;&#21547;&#26377;&#24102;&#38750;&#24179;&#20961;<a href="cpp-language-default_constructor.html">&#40664;&#35748;&#26500;&#36896;&#20989;&#25968;</a>&#30340;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#65292;&#37027;&#20040;&#35813;&#32852;&#21512;&#20307;&#30340;&#40664;&#35748;&#26500;&#36896;&#20989;&#25968;&#40664;&#35748;&#34987;&#24323;&#32622;&#65292;&#38500;&#38750;&#35813;&#32852;&#21512;&#20307;&#30340;<a href="cpp-language-union.html#.E8.81.94.E5.90.88.E4.BD.93.E5.BC.8F.E7.9A.84.E7.B1.BB">&#21464;&#20307;&#25104;&#21592;</a>&#25317;&#26377;&#19968;&#20010;&#40664;&#35748;&#25104;&#21592;&#21021;&#22987;&#21270;&#22120;&#12290;</p>
<p>&#26368;&#22810;&#21482;&#26377;&#19968;&#20010;<a href="cpp-language-union.html#.E8.81.94.E5.90.88.E4.BD.93.E5.BC.8F.E7.9A.84.E7.B1.BB">&#21464;&#20307;&#25104;&#21592;</a>&#21487;&#20197;&#25317;&#26377;<a href="cpp-language-data_members.html#.E6.88.90.E5.91.98.E5.88.9D.E5.A7.8B.E5.8C.96">&#40664;&#35748;&#25104;&#21592;&#21021;&#22987;&#21270;&#22120;</a>&#12290;</p>
</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
</table>
<p>&#27491;&#22914;<a href="cpp-language-classes.html">&#32467;&#26500;&#20307;&#30340;</a>&#22768;&#26126;&#20013;&#19968;&#33324;&#65292;&#32852;&#21512;&#20307;&#30340;&#40664;&#35748;&#25104;&#21592;&#35775;&#38382;&#26159; <a href="cpp-language-access.html">public</a>&#12290;</p>
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">&#35299;&#37322;</span></h3>
<p>&#32852;&#21512;&#20307;&#30340;&#22823;&#23567;&#20165;&#36275;&#20197;&#20445;&#26377;&#20854;&#26368;&#22823;&#30340;&#25968;&#25454;&#25104;&#21592;&#12290;&#20854;&#20182;&#25968;&#25454;&#25104;&#21592;&#22312;&#35813;&#26368;&#22823;&#25104;&#21592;&#30340;&#19968;&#37096;&#20998;&#30456;&#21516;&#30340;&#23383;&#33410;&#20998;&#37197;&#12290;&#20998;&#37197;&#30340;&#32454;&#33410;&#26159;&#23454;&#29616;&#23450;&#20041;&#30340;&#65292;&#19988;&#35835;&#21462;&#24182;&#38750;&#26368;&#36817;&#20889;&#20837;&#30340;&#32852;&#21512;&#20307;&#25104;&#21592;&#26159;&#26410;&#23450;&#20041;&#34892;&#20026;&#12290;&#35768;&#22810;&#32534;&#35793;&#22120;&#20197;&#38750;&#26631;&#20934;&#35821;&#35328;&#25193;&#23637;&#23454;&#29616;&#35835;&#21462;&#32852;&#21512;&#20307;&#30340;&#19981;&#27963;&#36291;&#25104;&#21592;&#30340;&#33021;&#21147;&#12290;</p>
<div class="t-example">
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;cstdint&gt;</span>
<span class="kw1">union</span> S
<span class="br0">{</span>
<a href="cpp-types-integer.html"><span class="kw108">std::<span class="me2">int32_t</span></span></a> n<span class="sy4">;</span> <span class="co1">// &#21344;&#29992; 4 &#23383;&#33410;</span>
<a href="cpp-types-integer.html"><span class="kw121">std::<span class="me2">uint16_t</span></span></a> s<span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span><span class="sy4">;</span> <span class="co1">// &#21344;&#29992; 4 &#23383;&#33410;</span>
<a href="cpp-types-integer.html"><span class="kw120">std::<span class="me2">uint8_t</span></span></a> c<span class="sy4">;</span> <span class="co1">// &#21344;&#29992; 1 &#23383;&#33410;</span>
<span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#25972;&#20010;&#32852;&#21512;&#20307;&#21344;&#29992; 4 &#23383;&#33410;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
S s <span class="sy1">=</span> <span class="br0">{</span><span class="nu12">0x12345678</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#21021;&#22987;&#21270;&#39318;&#20010;&#25104;&#21592;&#65292;s.n &#29616;&#22312;&#26159;&#27963;&#36291;&#25104;&#21592;</span>
<span class="co1">// &#20110;&#27492;&#28857;&#65292;&#20174; s.s &#25110; s.c &#35835;&#21462;&#26159;&#26410;&#23450;&#20041;&#34892;&#20026;</span>
<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-hex.html"><span class="kw1782">std::<span class="me2">hex</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;s.n = &quot;</span> <span class="sy1">&lt;&lt;</span> s.<span class="me1">n</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span>
s.<span class="me1">s</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy1">=</span> <span class="nu12">0x0011</span><span class="sy4">;</span> <span class="co1">// s.s &#29616;&#22312;&#26159;&#27963;&#36291;&#25104;&#21592;</span>
<span class="co1">// &#22312;&#27492;&#28857;&#65292;&#20174; n &#25110; c &#35835;&#21462;&#26159; UB &#20294;&#22823;&#22810;&#25968;&#32534;&#35793;&#22120;&#37117;&#23545;&#20854;&#26377;&#23450;&#20041;</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;s.c &#29616;&#22312;&#26159; &quot;</span> <span class="sy1">&lt;&lt;</span> <span class="sy2">+</span>s.<span class="me1">c</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span> <span class="co1">// 11 &#25110; 00&#65292;&#21462;&#20915;&#20110;&#24179;&#21488;</span>
<span class="sy1">&lt;&lt;</span> <span class="st0">&quot;s.n &#29616;&#22312;&#26159; &quot;</span> <span class="sy1">&lt;&lt;</span> s.<span class="me1">n</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span> <span class="co1">// 12340011 &#25110; 00115678</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#21487;&#33021;&#30340;&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">s.n = 12345678
s.c &#29616;&#22312;&#26159; 0
s.n &#29616;&#22312;&#26159; 115678</pre></div>
</div>
</div>
<p>&#27599;&#20010;&#25104;&#21592;&#30340;&#20998;&#37197;&#37117;&#22914;&#21516;&#23427;&#26159;&#31867;&#30340;&#21807;&#19968;&#25104;&#21592;&#19968;&#26679;&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx11">
<td>
<p>&#22914;&#26524;&#32852;&#21512;&#20307;&#30340;&#25104;&#21592;&#26159;&#25317;&#26377;&#29992;&#25143;&#23450;&#20041;&#30340;&#26500;&#36896;&#20989;&#25968;&#21644;&#26512;&#26500;&#20989;&#25968;&#30340;&#31867;&#65292;&#37027;&#20040;&#20999;&#25442;&#20854;&#27963;&#36291;&#25104;&#21592;&#36890;&#24120;&#38656;&#35201;&#26174;&#24335;&#26512;&#26500;&#20989;&#25968;&#21644;&#24067;&#32622; new&#65306;</p>
<div class="t-example">
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;string&gt;</span>
<span class="co2">#include &lt;vector&gt;</span>
<span class="kw1">union</span> S
<span class="br0">{</span>
<a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a> str<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><span class="kw4">int</span><span class="sy1">&gt;</span> vec<span class="sy4">;</span>
~S<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span> <span class="co1">// &#38656;&#35201;&#30693;&#36947;&#21738;&#20010;&#25104;&#21592;&#27963;&#36291;&#65292;&#21482;&#33021;&#22312;&#32852;&#21512;&#20307;&#24335;&#30340;&#31867;&#20013;&#20570;&#21040;</span>
<span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#25972;&#20010;&#32852;&#21512;&#20307;&#21344;&#26377; max(sizeof(string), sizeof(vector&lt;int&gt;)) &#30340;&#20869;&#23384;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
S s <span class="sy1">=</span> <span class="br0">{</span><span class="st0">&quot;Hello, world&quot;</span><span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// &#22312;&#27492;&#28857;&#65292;&#20174; s.vec &#35835;&#21462;&#26159;&#26410;&#23450;&#20041;&#34892;&#20026;</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;s.str = &quot;</span> <span class="sy1">&lt;&lt;</span> s.<span class="me1">str</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span>
s.<span class="me1">str</span>.~basic_string<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
new <span class="br0">(</span><span class="sy3">&amp;</span>s.<span class="me1">vec</span><span class="br0">)</span> <a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span><span class="sy4">;</span>
<span class="co1">// &#29616;&#22312;&#65292;s.vec &#26159;&#32852;&#21512;&#20307;&#30340;&#27963;&#36291;&#25104;&#21592;</span>
s.<span class="me1">vec</span>.<span class="me1">push_back</span><span class="br0">(</span><span class="nu0">10</span><span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> s.<span class="me1">vec</span>.<span class="me1">size</span><span class="br0">(</span><span class="br0">)</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span>
s.<span class="me1">vec</span>.~vector<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">s.str = Hello, world
1</pre></div>
</div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
</table>
<p>&#22914;&#26524;&#20004;&#20010;&#32852;&#21512;&#20307;&#25104;&#21592;&#37117;&#26159;<a href="cpp-named_req-StandardLayoutType.html">&#26631;&#20934;&#24067;&#23616;&#31867;&#22411;</a>&#65292;&#37027;&#20040;&#22312;&#20219;&#20309;&#32534;&#35793;&#22120;&#19978;&#26816;&#39564;&#20854;&#20844;&#20849;&#23376;&#24207;&#21015;&#37117;&#26377;&#33391;&#22909;&#23450;&#20041;&#12290;</p>
<h4><span class="mw-headline" id=".E6.88.90.E5.91.98.E7.94.9F.E5.AD.98.E6.9C.9F">&#25104;&#21592;&#29983;&#23384;&#26399;</span></h4>
<p>&#32852;&#21512;&#20307;&#25104;&#21592;&#30340;<a href="cpp-language-lifetime.html">&#29983;&#23384;&#26399;</a>&#20174;&#35813;&#25104;&#21592;&#34987;&#35774;&#20026;&#27963;&#36291;&#65288;active&#65289;&#26102;&#24320;&#22987;&#12290;&#22914;&#26524;&#20043;&#21069;&#24050;&#32463;&#26377;&#21478;&#19968;&#25104;&#21592;&#27963;&#36291;&#65292;&#37027;&#20040;&#23427;&#30340;&#29983;&#23384;&#26399;&#32456;&#27490;&#12290;</p>
<p>&#24403;&#32852;&#21512;&#20307;&#30340;&#27963;&#36291;&#25104;&#21592;&#36890;&#36807;&#24418;&#24335;&#20026; <code>E1 = E2</code> &#30340;&#22797;&#21046;&#34920;&#36798;&#24335;&#65288;&#20351;&#29992;&#20869;&#24314;&#36171;&#20540;&#36816;&#31639;&#31526;&#25110;&#24179;&#20961;&#30340;&#36171;&#20540;&#36816;&#31639;&#31526;&#65289;&#20999;&#25442;&#26102;&#65292;&#23545;&#20110; <code>E1</code> &#20013;&#30340;&#21508;&#20010;&#25104;&#21592;&#35775;&#38382;&#21644;&#25968;&#32452;&#19979;&#26631;&#23376;&#34920;&#36798;&#24335;&#20013;&#20986;&#29616;&#30340;&#65292;&#20854;&#31867;&#22411;&#24182;&#38750;&#25317;&#26377;&#38750;&#24179;&#20961;&#25110;&#24323;&#32622;&#30340;&#40664;&#35748;&#26500;&#36896;&#20989;&#25968;&#30340;&#31867;&#30340;&#27599;&#20010;&#32852;&#21512;&#20307;&#25104;&#21592; X&#65292;&#22914;&#26524; X &#30340;&#20462;&#25913;&#22312;&#31867;&#22411;&#21035;&#21517;&#20351;&#29992;&#35268;&#21017;&#19979;&#20250;&#20855;&#26377;&#26410;&#23450;&#20041;&#34892;&#20026;&#65292;&#37027;&#20040;&#22312;&#25152;&#25351;&#21517;&#30340;&#23384;&#20648;&#20013;&#38544;&#24335;&#21019;&#24314;&#19968;&#20010; X &#31867;&#22411;&#30340;&#23545;&#35937;&#65307;&#19981;&#36827;&#34892;&#21021;&#22987;&#21270;&#65292;&#19988;&#20854;&#29983;&#23384;&#26399;&#30340;&#24320;&#22987;&#25353;&#39034;&#24207;&#26202;&#20110;&#20854;&#24038;&#21491;&#30340;&#25805;&#20316;&#25968;&#30340;&#20540;&#35745;&#31639;&#65292;&#32780;&#26089;&#20110;&#36171;&#20540;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">union</span> A <span class="br0">{</span> <span class="kw4">int</span> x<span class="sy4">;</span> <span class="kw4">int</span> y<span class="br0">[</span><span class="nu0">4</span><span class="br0">]</span><span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> B <span class="br0">{</span> A a<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">union</span> C <span class="br0">{</span> B b<span class="sy4">;</span> <span class="kw4">int</span> k<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> f<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
C c<span class="sy4">;</span> <span class="co1">// &#19981;&#24320;&#22987;&#20219;&#20309;&#32852;&#21512;&#20307;&#25104;&#21592;&#30340;&#29983;&#23384;&#26399;</span>
c.<span class="me1">b</span>.<span class="me1">a</span>.<span class="me1">y</span><span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span> <span class="sy1">=</span> <span class="nu0">4</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&quot;c.b.a.y[3]&quot; &#25351;&#21517;&#32852;&#21512;&#20307;&#25104;&#21592; c.b &#19982; c.b.a.y;</span>
<span class="co1">// &#36825;&#21019;&#24314;&#23545;&#35937;&#20197;&#20445;&#26377;&#32852;&#21512;&#20307;&#25104;&#21592; c.b &#21644; c.b.a.y</span>
<span class="kw1">return</span> c.<span class="me1">b</span>.<span class="me1">a</span>.<span class="me1">y</span><span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span><span class="sy4">;</span> <span class="co1">// OK&#65306;c.b.a.y &#25351;&#20195;&#26032;&#21019;&#24314;&#30340;&#23545;&#35937;</span>
<span class="br0">}</span>
<span class="kw1">struct</span> X <span class="br0">{</span> <span class="kw4">const</span> <span class="kw4">int</span> a<span class="sy4">;</span> <span class="kw4">int</span> b<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">union</span> Y <span class="br0">{</span> X x<span class="sy4">;</span> <span class="kw4">int</span> k<span class="sy4">;</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>
Y y <span class="sy1">=</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="sy4">;</span> <span class="co1">// OK&#65292;y.x &#26159;&#32852;&#21512;&#20307;&#30340;&#27963;&#36291;&#25104;&#21592;</span>
<span class="kw4">int</span> n <span class="sy1">=</span> y.<span class="me1">x</span>.<span class="me1">a</span><span class="sy4">;</span>
y.<span class="me1">k</span> <span class="sy1">=</span> <span class="nu0">4</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#32467;&#26463; y.x &#30340;&#29983;&#23384;&#26399;&#65292;y.k &#26159;&#32852;&#21512;&#20307;&#30340;&#27963;&#36291;&#25104;&#21592;</span>
y.<span class="me1">x</span>.<span class="me1">b</span> <span class="sy1">=</span> n<span class="sy4">;</span> <span class="co1">// &#26410;&#23450;&#20041;&#34892;&#20026;&#65306;y.x.b &#22312;&#20854;&#29983;&#23384;&#26399;&#22806;&#34987;&#20462;&#25913;&#65292;</span>
<span class="co1">// &quot;y.x.b&quot; &#25351;&#21517; y.x&#65292;&#20294; X &#30340;&#40664;&#35748;&#26500;&#36896;&#20989;&#25968;&#34987;&#24323;&#32622;&#65292;</span>
<span class="co1">// &#25152;&#20197;&#32852;&#21512;&#20307;&#25104;&#21592; y.x &#30340;&#29983;&#23384;&#26399;&#19981;&#20250;&#38544;&#24335;&#24320;&#22987;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#32852;&#21512;&#20307;&#31867;&#22411;&#30340;&#24179;&#20961;<span class="t-rev-inl t-since-cxx11"><span>&#31227;&#21160;&#26500;&#36896;&#20989;&#25968;&#12289;&#31227;&#21160;&#36171;&#20540;&#36816;&#31639;&#31526;&#12289;</span> <span><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></span></span>&#22797;&#21046;&#26500;&#36896;&#20989;&#25968;&#21644;&#22797;&#21046;&#36171;&#20540;&#36816;&#31639;&#31526;&#22797;&#21046;&#23545;&#35937;&#34920;&#31034;&#12290;&#22914;&#26524;&#28304;&#19982;&#30446;&#26631;&#19981;&#26159;&#21516;&#19968;&#23545;&#35937;&#65292;&#37027;&#20040;&#36825;&#20123;&#29305;&#27530;&#25104;&#21592;&#20989;&#25968;&#22312;&#22797;&#21046;&#21069;&#24320;&#22987;&#27599;&#20010;&#20869;&#23884;&#20110;&#30446;&#26631;&#30340;&#24182;&#23545;&#24212;&#20869;&#23884;&#20110;&#28304;&#30340;&#23545;&#35937;&#65288;&#38500;&#20102;&#26082;&#38750;&#30446;&#26631;&#30340;&#23376;&#23545;&#35937;&#20134;&#19981;&#25317;&#26377;<a href="cpp-language-lifetime.html#.E9.9A.90.E5.BC.8F.E7.94.9F.E5.AD.98.E6.9C.9F.E7.B1.BB.E5.9E.8B">&#38544;&#24335;&#29983;&#23384;&#26399;&#31867;&#22411;</a>&#30340;&#23545;&#35937;&#65289;&#30340;&#29983;&#23384;&#26399;&#12290;&#21542;&#21017;&#65292;&#23427;&#20204;&#19981;&#20570;&#20219;&#20309;&#20107;&#12290;&#22312;&#32463;&#30001;&#24179;&#20961;&#29305;&#27530;&#25104;&#21592;&#20989;&#25968;&#26500;&#36896;&#25110;&#36171;&#20540;&#21518;&#65292;&#20004;&#20010;&#32852;&#21512;&#20307;&#23545;&#35937;&#25317;&#26377;&#30456;&#21516;&#30340;&#23545;&#24212;&#27963;&#36291;&#25104;&#21592;&#65288;&#22914;&#26524;&#23384;&#22312;&#65289;&#12290;</p>
<h4><span class="mw-headline" id=".E5.8C.BF.E5.90.8D.E8.81.94.E5.90.88.E4.BD.93">&#21311;&#21517;&#32852;&#21512;&#20307;</span></h4>
<p><i>&#21311;&#21517;&#32852;&#21512;&#20307;</i>&#26159;&#19981;&#21516;&#26102;&#23450;&#20041;&#20219;&#20309;&#21464;&#37327;&#65288;&#21253;&#25324;&#32852;&#21512;&#20307;&#31867;&#22411;&#30340;&#23545;&#35937;&#12289;&#24341;&#29992;&#25110;&#25351;&#21521;&#32852;&#21512;&#20307;&#30340;&#25351;&#38024;&#65289;&#30340;&#26080;&#21517;&#30340;&#32852;&#21512;&#20307;&#23450;&#20041;&#12290;</p>
<table class="t-sdsc-begin">
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td class="t-sdsc-nopad"><code><b>union</b></code> <code><b>{</b></code> <span class="t-spar">&#25104;&#21592;&#35828;&#26126;</span> <code><b>}</b></code> <code><b>;</b></code></td>
<td class="t-sdsc-nopad"></td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
</table>
<p>&#21311;&#21517;&#32852;&#21512;&#20307;&#26377;&#26356;&#22810;&#38480;&#21046;&#65306;&#23427;&#20204;&#19981;&#33021;&#26377;&#25104;&#21592;&#20989;&#25968;&#65292;&#19981;&#33021;&#26377;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#65292;&#19988;&#25152;&#26377;&#25968;&#25454;&#25104;&#21592;&#24517;&#39035;&#20844;&#24320;&#12290;&#21482;&#33021;&#22768;&#26126;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;<span class="t-rev-inl t-since-cxx11"><span>&#65292;&#22806;&#21152;<a href="cpp-language-static_assert.html"><code>static_assert</code></a> &#22768;&#26126;</span> <span><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></span></span>&#12290;</p>
<p>&#21311;&#21517;&#32852;&#21512;&#20307;&#30340;&#25104;&#21592;&#34987;&#27880;&#20837;&#21040;&#23427;&#30340;&#22806;&#22260;&#20316;&#29992;&#22495;&#20013;&#65288;&#32780;&#19988;&#19981;&#24471;&#19982;&#20854;&#20013;&#22768;&#26126;&#30340;&#20854;&#20182;&#21517;&#23383;&#20914;&#31361;&#65289;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="kw1">union</span>
<span class="br0">{</span>
<span class="kw4">int</span> a<span class="sy4">;</span>
<span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> p<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
a <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
p <span class="sy1">=</span> <span class="st0">&quot;Jennifer&quot;</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#21629;&#21517;&#31354;&#38388;&#20316;&#29992;&#22495;&#30340;&#21311;&#21517;&#32852;&#21512;&#20307;&#24517;&#39035;&#22768;&#26126;&#20026; static&#65292;&#38500;&#38750;&#23427;&#20204;&#22312;&#26080;&#21517;&#21629;&#21517;&#31354;&#38388;&#20986;&#29616;&#12290;</p>
<h4><span class="mw-headline" id=".E8.81.94.E5.90.88.E4.BD.93.E5.BC.8F.E7.9A.84.E7.B1.BB">&#32852;&#21512;&#20307;&#24335;&#30340;&#31867;</span></h4>
<p><i>&#32852;&#21512;&#20307;&#24335;&#30340;&#31867;&#65288;union-like class&#65289;</i>&#26159;&#32852;&#21512;&#20307;&#65292;&#25110;&#26159;&#33267;&#23569;&#25317;&#26377;&#19968;&#20010;&#21311;&#21517;&#32852;&#21512;&#20307;&#25104;&#21592;&#30340;&#65288;&#38750;&#32852;&#21512;&#65289;&#31867;&#12290;&#32852;&#21512;&#20307;&#24335;&#30340;&#31867;&#25317;&#26377;&#19968;&#32452;<i>&#21464;&#20307;&#25104;&#21592;&#65288;variant member&#65289;</i>&#65306;</p>
<ul>
<li>&#20854;&#25104;&#21592;&#21311;&#21517;&#32852;&#21512;&#20307;&#30340;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#65307;</li>
<li>&#21478;&#22806;&#65292;&#22914;&#26524;&#32852;&#21512;&#20307;&#24335;&#30340;&#31867;&#26159;&#32852;&#21512;&#20307;&#65292;&#21017;&#20026;&#20854;&#24182;&#38750;&#21311;&#21517;&#32852;&#21512;&#20307;&#30340;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#12290;</li>
</ul>
<p>&#32852;&#21512;&#20307;&#24335;&#30340;&#31867;&#21487;&#29992;&#20110;&#23454;&#29616;<a href="https://en.wikipedia.org/wiki/Tagged_union" class="extiw" title="enwiki:Tagged union">&#24102;&#26631;&#31614;&#32852;&#21512;&#20307;&#65288;tagged union&#65289;</a>&#12290;</p>
<div class="t-example">
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
<span class="co1">// S &#25317;&#26377;&#19968;&#20010;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#65288;tag&#65289;&#65292;&#19977;&#20010;&#26522;&#20030;&#39033;&#25104;&#21592;&#65288;CHAR&#12289;INT&#12289;DOUBLE&#65289;&#65292;</span>
<span class="co1">// &#21644;&#19977;&#20010;&#21464;&#20307;&#25104;&#21592;&#65288;c&#12289;i&#12289;d&#65289;</span>
<span class="kw1">struct</span> S
<span class="br0">{</span>
<span class="kw2">enum</span><span class="br0">{</span>CHAR, INT, DOUBLE<span class="br0">}</span> tag<span class="sy4">;</span>
<span class="kw1">union</span>
<span class="br0">{</span>
<span class="kw4">char</span> c<span class="sy4">;</span>
<span class="kw4">int</span> i<span class="sy4">;</span>
<span class="kw4">double</span> d<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">void</span> print_s<span class="br0">(</span><span class="kw4">const</span> S<span class="sy3">&amp;</span> s<span class="br0">)</span>
<span class="br0">{</span>
<span class="kw1">switch</span><span class="br0">(</span>s.<span class="me1">tag</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="kw1">case</span> S<span class="sy4">::</span><span class="me2">CHAR</span><span class="sy4">:</span> <a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> s.<span class="me1">c</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
<span class="kw1">case</span> S<span class="sy4">::</span><span class="me2">INT</span><span class="sy4">:</span> <a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> s.<span class="me1">i</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
<span class="kw1">case</span> S<span class="sy4">::</span><span class="me2">DOUBLE</span><span class="sy4">:</span> <a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> s.<span class="me1">d</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="br0">}</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
S s <span class="sy1">=</span> <span class="br0">{</span>S<span class="sy4">::</span><span class="me2">CHAR</span>, <span class="st0">&#39;a&#39;</span><span class="br0">}</span><span class="sy4">;</span>
print_s<span class="br0">(</span>s<span class="br0">)</span><span class="sy4">;</span>
s.<span class="me1">tag</span> <span class="sy1">=</span> S<span class="sy4">::</span><span class="me2">INT</span><span class="sy4">;</span>
s.<span class="me1">i</span> <span class="sy1">=</span> <span class="nu0">123</span><span class="sy4">;</span>
print_s<span class="br0">(</span>s<span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">a
123</pre></div>
</div>
</div>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx17">
<td>
<p>C++ &#26631;&#20934;&#24211;&#21253;&#21547; <span class="t-lc"><a href="cpp-utility-variant.html">std::variant</a></span>&#65292;&#23427;&#21487;&#20197;&#21462;&#20195;&#32852;&#21512;&#20307;&#21644;&#32852;&#21512;&#20307;&#24335;&#30340;&#31867;&#30340;&#22823;&#22810;&#25968;&#29992;&#36884;&#12290;&#19978;&#20363;&#21487;&#37325;&#20889;&#20026;</p>
<div class="t-example">
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;variant&gt;</span>
<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-utility-variant.html"><span class="kw1085">std::<span class="me2">variant</span></span></a><span class="sy1">&lt;</span><span class="kw4">char</span>, <span class="kw4">int</span>, <span class="kw4">double</span><span class="sy1">&gt;</span> s <span class="sy1">=</span> <span class="st0">&#39;a&#39;</span><span class="sy4">;</span>
<a href="cpp-utility-variant-visit.html"><span class="kw1086">std::<span class="me2">visit</span></span></a><span class="br0">(</span><span class="br0">[</span><span class="br0">]</span><span class="br0">(</span><span class="kw4">auto</span> x<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> x <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span><span class="br0">}</span>, s<span class="br0">)</span><span class="sy4">;</span>
s <span class="sy1">=</span> <span class="nu0">123</span><span class="sy4">;</span>
<a href="cpp-utility-variant-visit.html"><span class="kw1086">std::<span class="me2">visit</span></span></a><span class="br0">(</span><span class="br0">[</span><span class="br0">]</span><span class="br0">(</span><span class="kw4">auto</span> x<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> x <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span><span class="br0">}</span>, s<span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">a
123</pre></div>
</div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></td>
</tr>
</table>
<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/issue1940">CWG 1940</a></td>
<td>C++11</td>
<td>&#21311;&#21517;&#32852;&#21512;&#20307;&#21482;&#20801;&#35768;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;</td>
<td>&#20063;&#20801;&#35768; <code>static_assert</code></td>
</tr>
</table>
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">&#21442;&#38405;</span></h3>
<table class="t-dsc-begin"></table>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>