520 lines
55 KiB
HTML
520 lines
55 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>枚举声明</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_enum skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">枚举声明</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <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><i>枚举(enumeration)</i>是独立的类型,它的值被限制在一个取值范围内(细节见下文),它可以包含数个明确命名的常量(“<i>枚举项(enumerator)</i>”)。各常量的值是某个整型类型(称为该枚举的<i>底层类型(underlying type)</i>)的值。</p>
|
|
<p>枚举以下列语法定义:</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">枚举关键词</span> <span class="t-spar">属性</span><span class="t-mark">(可选)</span> <span class="t-spar">枚举名</span><span class="t-mark">(可选)</span> <span class="t-spar">枚举基</span><span class="t-mark">(可选)</span> <code><b>{</b></code> <span class="t-spar">枚举项列表</span><span class="t-mark">(可选)</span> <code><b>}</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><span class="t-spar">枚举关键词</span> <span class="t-spar">属性</span><span class="t-mark">(可选)</span> <span class="t-spar">枚举名</span> <span class="t-spar">枚举基</span><span class="t-mark">(可选)</span> <code><b>;</b></code></td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> <i>枚举说明符</i>,出现于<a href="cpp-language-declarations.html">声明</a>语法的 <span class="t-spar">声明说明符序列</span> :定义枚举类型与其枚举项。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> <i>不可见(opaque)枚举声明</i>:定义枚举类型,但不定义其枚举项:在此声明后,该类型是完整类型,且其大小已知。注意:仅有的在 <span class="t-spar">枚举名</span> 之前出现 <span class="t-spar">嵌套名说明符</span> 的情况,是类模板的有作用域枚举成员的<a href="cpp-language-template_specialization.html">显式特化声明</a>}}。</div>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">枚举关键字</span></td>
|
|
<td>-</td>
|
|
<td>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-until-cxx11">
|
|
<td>
|
|
<p><code><b>enum</b></code></p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-until-cxx11">(C++11 前)</span></td>
|
|
</tr>
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<p><code><b>enum</b></code>、 <code><b>enum class</b></code> 或 <code><b>enum struct</b></code> 之一</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">属性</span></td>
|
|
<td>-</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span> 可选的任意数量的<a href="cpp-language-attributes.html">属性</a>序列</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">枚举名</span></td>
|
|
<td>-</td>
|
|
<td>所声明的枚举的名字。
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<p>只能在非不可见的无作用域枚举声明中省略名字。如果名字存在且此声明是重声明,那么它前面可以带有 <span class="t-spar">嵌套名说明符</span>,即名字和作用域解析运算符 <code>::</code> 的序列并以作用域解析运算符结尾。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">枚举基</span></td>
|
|
<td>-</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span> 冒号 (<code><b>:</b></code>),后随指名某个整型类型的 <span class="t-spar">类型说明符序列</span>(忽略其限定性),该类型将作为此枚举类型的固定底层类型</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">枚举项列表</span></td>
|
|
<td>-</td>
|
|
<td>枚举项定义的逗号分隔列表,每项要么是简单的 <span class="t-spar">标识符</span>,它成为枚举项的名字,要么是带初始化器的标识符:<span class="t-spar">标识符</span> <code><b>=</b></code> <span class="t-spar">常量表达式</span>。<span class="t-rev-inl t-since-cxx17"><span>在任一情况下,<span class="t-spar">标识符</span> 可直接后随一个可选的<a href="cpp-language-attributes.html">属性说明符序列</a>。</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></span></span></td>
|
|
</tr>
|
|
</table>
|
|
<p>有两种截然不同的枚举:<i>无作用域枚举</i>(以 <span class="t-spar">枚举关键词</span> <code><b>enum</b></code> 声明)和<i>有作用域枚举</i>(以 <span class="t-spar">枚举关键词</span> <code><b>enum class</b></code> 或 <code><b>enum struct</b></code> 声明)。</p>
|
|
<h3><span class="mw-headline" id=".E6.97.A0.E4.BD.9C.E7.94.A8.E5.9F.9F.E6.9E.9A.E4.B8.BE">无作用域枚举</span></h3>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>enum</b></code> <span class="t-spar">名字</span><span class="t-mark">(可选)</span> <code><b>{</b></code> <span class="t-spar">枚举项</span> <code><b>=</b></code> <span class="t-spar">常量表达式</span> <code><b>,</b></code> <span class="t-spar">枚举项</span> <code><b>=</b></code> <span class="t-spar">常量表达式</span> <code><b>,</b></code> ... <code><b>}</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>enum</b></code> <span class="t-spar">名字</span><span class="t-mark">(可选)</span> <code><b>:</b></code> <span class="t-spar">类型</span> <code><b>{</b></code> <span class="t-spar">枚举项</span> <code><b>=</b></code> <span class="t-spar">常量表达式</span> <code><b>,</b></code> <span class="t-spar">枚举项</span> <code><b>=</b></code> <span class="t-spar">常量表达式</span> <code><b>,</b></code> ... <code><b>}</b></code></td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>enum</b></code> <span class="t-spar">名字</span> <code><b>:</b></code> <span class="t-spar">类型</span> <code><b>;</b></code></td>
|
|
<td>(3)</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 声明一个无作用域枚举类型,其底层类型不固定(此时底层类型是由实现定义的某个能表示所有枚举项值的整型类型;此类型不大于 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span>,除非枚举项的值不能放入 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">int</span></span></span>。如果 <span class="t-spar">枚举项列表</span> 为空,则底层类型为如同枚举拥有单个值为 0 的枚举项)。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 声明一个底层类型固定的无作用域枚举类型。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 无作用域枚举的不可见枚举声明必须指定名字与底层类型。</div>
|
|
<p>每个 <span class="t-spar">枚举项</span> 都成为该枚举类型(即 <span class="t-spar">名字</span>)的一个具名常量,在其外围作用域可见,且可用于要求常量的任何位置。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw2">enum</span> Color <span class="br0">{</span> red, green, blue <span class="br0">}</span><span class="sy4">;</span>
|
|
Color r <span class="sy1">=</span> red<span class="sy4">;</span>
|
|
<span class="kw1">switch</span><span class="br0">(</span>r<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw1">case</span> red <span class="sy4">:</span> <a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"红<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
|
|
<span class="kw1">case</span> green<span class="sy4">:</span> <a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"绿<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
|
|
<span class="kw1">case</span> blue <span class="sy4">:</span> <a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"蓝<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>每个枚举项都与一个底层类型的值相关联。当在 <span class="t-spar">枚举项列表</span> 中提供了初始化器时,各枚举项的值由那些初始化器所定义。如果首个枚举项无初始化器,那么它的关联值为零。对于其他任何定义中无初始化器的枚举项,其关联值为前一枚举项加一。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw2">enum</span> Foo <span class="br0">{</span> a, b, c <span class="sy1">=</span> <span class="nu0">10</span>, d, e <span class="sy1">=</span> <span class="nu0">1</span>, f, g <span class="sy1">=</span> f <span class="sy2">+</span> c <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="co1">//a = 0, b = 1, c = 10, d = 11, e = 1, f = 2, g = 12</span></pre></div>
|
|
</div>
|
|
<p>无作用域枚举类型的值<a href="cpp-language-implicit_conversion.html#.E6.95.B4.E5.9E.8B.E6.8F.90.E5.8D.87">可隐式转换</a>为整型类型。如果底层类型不固定,那么该值可转换到下列首个能保有其整个值范围的类型:<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">int</span></span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span></span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span></span></span><span class="t-rev-inl t-since-cxx11"><span>、<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">long</span></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span></span></span>、拥有更高转换等级的扩展整数类型(按转换等级顺序,有符号优先于无符号)</span> <span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></span></span>。如果底层类型固定,那么该值可转换到其提升后的底层类型(在<a href="cpp-language-overload_resolution.html">重载决议</a>中优先),之后它能被<a href="cpp-language-implicit_conversion.html#.E6.95.B4.E5.9E.8B.E6.8F.90.E5.8D.87">提升</a>。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw2">enum</span> color <span class="br0">{</span> red, yellow, green <span class="sy1">=</span> <span class="nu0">20</span>, blue <span class="br0">}</span><span class="sy4">;</span>
|
|
color col <span class="sy1">=</span> red<span class="sy4">;</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> blue<span class="sy4">;</span> <span class="co1">// n == 21</span></pre></div>
|
|
</div>
|
|
<p>整数、浮点和枚举类型的值可用 <a href="cpp-language-static_cast.html"><code>static_cast</code></a> 或<a href="cpp-language-explicit_cast.html">显式转型</a>转换到任何枚举类型。如果底层类型不固定且源值在范围外(源值,如果是浮点类型则首先转换到枚举的底层类型,能以足以保有目标枚举的所有枚举项的最小位域表示的情况下在范围内),则行为未定义。否则,结果与<a href="cpp-language-implicit_conversion.html">隐式转换</a>到底层类型的结果相同。</p>
|
|
<p>注意,这种转换后的值不必等于任何为该枚举所定义的具名枚举项。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw2">enum</span> access_t <span class="br0">{</span> read <span class="sy1">=</span> <span class="nu0">1</span>, write <span class="sy1">=</span> <span class="nu0">2</span>, exec <span class="sy1">=</span> <span class="nu0">4</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">//枚举项:1、2、4 范围:0..7</span>
|
|
access_t rwe <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span>access_t<span class="sy1">></span><span class="br0">(</span><span class="nu0">7</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span><span class="br0">(</span>rwe <span class="sy3">&</span> read<span class="br0">)</span> <span class="sy3">&&</span> <span class="br0">(</span>rwe <span class="sy3">&</span> write<span class="br0">)</span> <span class="sy3">&&</span> <span class="br0">(</span>rwe <span class="sy3">&</span> exec<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
access_t x <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span>access_t<span class="sy1">></span><span class="br0">(</span><span class="nu16">8.0</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// CWG1766 起是未定义行为</span>
|
|
access_t y <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span>access_t<span class="sy1">></span><span class="br0">(</span><span class="nu0">8</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// CWG1766 起是未定义行为</span>
|
|
|
|
<span class="kw2">enum</span> foo <span class="br0">{</span> a <span class="sy1">=</span> <span class="nu0">0</span>, b <span class="sy1">=</span> <a href="cpp-types-climits.html"><span class="kw403">UINT_MAX</span></a> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 范围:[0, UINT_MAX]</span>
|
|
foo x<span class="sy1">=</span> foo<span class="br0">(</span><span class="sy2">-</span><span class="nu0">1</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// CWG1766 起是未定义行为,即使 foo 的底层类型是 unsigned int</span></pre></div>
|
|
</div>
|
|
<p>无作用域枚举的 <span class="t-spar">名字</span> 可以忽略:这种声明仅将各枚举项引入到其外围作用域中:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw2">enum</span> <span class="br0">{</span> a, b, c <span class="sy1">=</span> <span class="nu0">0</span>, d <span class="sy1">=</span> a <span class="sy2">+</span> <span class="nu0">2</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 定义 a = 0, b = 1, c = 0, d = 2</span></pre></div>
|
|
</div>
|
|
<p>当无作用域枚举是类成员时,其枚举项可以通过类成员访问运算符 <code><b>.</b></code> 和 <code><b>-></b></code> 访问:</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>
|
|
<span class="kw2">enum</span> direction <span class="br0">{</span> left <span class="sy1">=</span> <span class="st0">'l'</span>, right <span class="sy1">=</span> <span class="st0">'r'</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
X x<span class="sy4">;</span>
|
|
X<span class="sy2">*</span> p <span class="sy1">=</span> <span class="sy3">&</span>x<span class="sy4">;</span>
|
|
|
|
<span class="kw4">int</span> a <span class="sy1">=</span> X<span class="sy4">::</span><span class="me2">direction</span><span class="sy4">::</span><span class="me2">left</span><span class="sy4">;</span> <span class="co1">// 仅从 C++11 开始允许</span>
|
|
<span class="kw4">int</span> b <span class="sy1">=</span> X<span class="sy4">::</span><span class="me2">left</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> c <span class="sy1">=</span> x.<span class="me1">left</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> d <span class="sy1">=</span> p<span class="sy2">-</span><span class="sy1">></span>left<span class="sy4">;</span></pre></div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E6.9C.89.E4.BD.9C.E7.94.A8.E5.9F.9F.E6.9E.9A.E4.B8.BE">有作用域枚举</span></h3>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>enum</b></code> <code><b>struct|class</b></code> <span class="t-spar">名字</span> <code><b>{</b></code> <span class="t-spar">枚举项</span> <code><b>=</b></code> <span class="t-spar">常量表达式</span> <code><b>,</b></code> <span class="t-spar">枚举项</span> <code><b>=</b></code> <span class="t-spar">常量表达式</span> <code><b>,</b></code> ... <code><b>}</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>enum</b></code> <code><b>struct|class</b></code> <span class="t-spar">名字</span> <code><b>:</b></code> <span class="t-spar">类型</span> <code><b>{</b></code> <span class="t-spar">枚举项</span> <code><b>=</b></code> <span class="t-spar">常量表达式</span> <code><b>,</b></code> <span class="t-spar">枚举项</span> <code><b>=</b></code> <span class="t-spar">常量表达式</span> <code><b>,</b></code> ... <code><b>}</b></code></td>
|
|
<td>(2)</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>enum</b></code> <code><b>struct|class</b></code> <span class="t-spar">名字</span> <code><b>;</b></code></td>
|
|
<td>(3)</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>enum</b></code> <code><b>struct|class</b></code> <span class="t-spar">名字</span> <code><b>:</b></code> <span class="t-spar">类型</span> <code><b>;</b></code></td>
|
|
<td>(4)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 声明底层类型为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span> 的有作用域枚举类型(关键词 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">class</span></span></span> 与 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">struct</span></span></span> 完全等价)</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 声明底层类型为 <span class="t-spar">类型</span> 的有作用域枚举类型</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 底层类型为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span> 的有作用域枚举类型的不可见枚举声明</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> 底层类型为 <span class="t-spar">类型</span> 的有作用域枚举类型的不可见枚举声明</div>
|
|
<p>每个 <span class="t-spar">枚举项</span> 都成为该枚举的类型(即 <span class="t-spar">名字</span>)的具名常量,它为该枚举的作用域所包含,且可用作用域解析运算符访问。没有从有作用域枚举项到整数类型的隐式转换,尽管 <a href="cpp-language-static_cast.html"><code>static_cast</code></a> 可用于获得枚举项的数值。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw2">enum</span> <span class="kw1">class</span> Color <span class="br0">{</span> red, green <span class="sy1">=</span> <span class="nu0">20</span>, blue <span class="br0">}</span><span class="sy4">;</span>
|
|
Color r <span class="sy1">=</span> Color<span class="sy4">::</span><span class="me2">blue</span><span class="sy4">;</span>
|
|
<span class="kw1">switch</span><span class="br0">(</span>r<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw1">case</span> Color<span class="sy4">::</span><span class="me2">red</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"><<</span> <span class="st0">"红<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
|
|
<span class="kw1">case</span> Color<span class="sy4">::</span><span class="me2">green</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"><<</span> <span class="st0">"绿<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
|
|
<span class="kw1">case</span> Color<span class="sy4">::</span><span class="me2">blue</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"><<</span> <span class="st0">"蓝<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<span class="co1">// int n = r; // 错误:不存在从有作用域枚举到 int 的隐式转换</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> <span class="kw1">static_cast</span><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span><span class="br0">(</span>r<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK, n = 21</span></pre></div>
|
|
</div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx17">
|
|
<td>
|
|
<p>枚举在满足下列条件时都能用<a href="cpp-language-list_initialization.html">列表初始化</a>从一个整数初始化而无需转型:</p>
|
|
<ul>
|
|
<li>初始化是直接列表初始化</li>
|
|
<li>初始化器列表仅有单个元素</li>
|
|
<li>枚举是底层类型固定的有作用域枚举或无作用域枚举</li>
|
|
<li>转换为非窄化转换</li>
|
|
</ul>
|
|
<p>这使得我们能引入新的整数类型(例如 SafeInt)并享受与其底层整数类型相同的既存调用约定,即使 ABI 不利于以值传递/返回结构体。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw2">enum</span> byte <span class="sy4">:</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// byte 是新的整数类型</span>
|
|
byte b <span class="br0">{</span> <span class="nu0">42</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// C++17 起 OK(直接列表初始化)</span>
|
|
byte c <span class="sy1">=</span> <span class="br0">{</span> <span class="nu0">42</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 错误</span>
|
|
byte d <span class="sy1">=</span> byte<span class="br0">{</span> <span class="nu0">42</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// C++17 起 OK;与 b 的值相同</span>
|
|
byte e <span class="br0">{</span> <span class="sy2">-</span><span class="nu0">1</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 错误</span>
|
|
|
|
<span class="kw1">struct</span> A <span class="br0">{</span> byte b<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
A a1 <span class="sy1">=</span> <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">// 错误(构造函数形参的复制列表初始化)</span>
|
|
A a2 <span class="sy1">=</span> <span class="br0">{</span> byte<span class="br0">{</span> <span class="nu0">42</span> <span class="br0">}</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// C++17 起 OK</span>
|
|
|
|
<span class="kw4">void</span> f<span class="br0">(</span>byte<span class="br0">)</span><span class="sy4">;</span>
|
|
f<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">// 错误(函数形参的复制列表初始化)</span>
|
|
|
|
<span class="kw2">enum</span> <span class="kw1">class</span> Handle <span class="sy4">:</span> <a href="cpp-types-integer.html"><span class="kw122">std::<span class="me2">uint32_t</span></span></a> <span class="br0">{</span> Invalid <span class="sy1">=</span> <span class="nu0">0</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
Handle h <span class="br0">{</span> <span class="nu0">42</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// C++17 起 OK</span></pre></div>
|
|
</div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx20">
|
|
<td>
|
|
<h3><span class="mw-headline" id="using_enum_.E5.A3.B0.E6.98.8E">using enum 声明</span></h3>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>using</b></code> <code><b>enum</b></code> <span class="t-spar">嵌套名说明符</span><span class="t-mark">(可选)</span> <span class="t-spar">名字</span> <code><b>;</b></code></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>其中 <span class="t-spar">嵌套名说明符</span><span class="t-mark">(可选)</span> <span class="t-spar">名字</span> 不得指名<a href="cpp-language-dependent_name.html#.E5.BE.85.E5.86.B3.E7.B1.BB.E5.9E.8B">待决类型</a>且必须指名一个枚举类型。</p>
|
|
<p>using enum 声明引入其所指名的枚举的枚举项名字,如同用对每个枚举项的 <a href="cpp-language-using_declaration.html">using 声明</a>。在类作用域中时,using enum 声明将其指名的枚举的枚举项名字作为成员添加到作用域,使成员查找能访问它们。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw2">enum</span> <span class="kw1">class</span> fruit <span class="br0">{</span> orange, apple <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> S <span class="br0">{</span>
|
|
<span class="kw1">using</span> <span class="kw2">enum</span> fruit<span class="sy4">;</span> <span class="co1">// OK :引入 orange 与 apple 到 S 中</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
S s<span class="sy4">;</span>
|
|
s.<span class="me1">orange</span><span class="sy4">;</span> <span class="co1">// OK :指名 fruit::orange</span>
|
|
S<span class="sy4">::</span><span class="me2">orange</span><span class="sy4">;</span> <span class="co1">// OK :指名 fruit::orange</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>引入两个同名的枚举项的两个 using enum 声明会冲突。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw2">enum</span> <span class="kw1">class</span> fruit <span class="br0">{</span> orange, apple <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw2">enum</span> <span class="kw1">class</span> color <span class="br0">{</span> red, orange <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw1">using</span> <span class="kw2">enum</span> fruit<span class="sy4">;</span> <span class="co1">// OK</span>
|
|
<span class="co1">// using enum color; // 错误:color::orange 与 fruit::orange 冲突</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>尽管从范围外的值转换到无固定底层类型的枚举由 <a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue1766">CWG 问题 1766</a> 设为未定义行为,目前没有编译器在常量求值中对它进行要求的诊断。</p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</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="co2">#include <iostream></span>
|
|
<span class="co2">#include <cstdint></span>
|
|
|
|
<span class="co1">// 采用 16 位的枚举</span>
|
|
<span class="kw2">enum</span> smallenum<span class="sy4">:</span> <a href="cpp-types-integer.html"><span class="kw107">std::<span class="me2">int16_t</span></span></a>
|
|
<span class="br0">{</span>
|
|
a,
|
|
b,
|
|
c
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
|
|
<span class="co1">// color 可为 red (值为 0)、 yellow (值为 1)、 green (值为 20)或 blue (值为 21)</span>
|
|
<span class="kw2">enum</span> color
|
|
<span class="br0">{</span>
|
|
red,
|
|
yellow,
|
|
green <span class="sy1">=</span> <span class="nu0">20</span>,
|
|
blue
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// altitude 可为 altitude::high 或 altitude::low</span>
|
|
<span class="kw2">enum</span> <span class="kw1">class</span> altitude<span class="sy4">:</span> <span class="kw4">char</span>
|
|
<span class="br0">{</span>
|
|
high<span class="sy1">=</span><span class="st0">'h'</span>,
|
|
low<span class="sy1">=</span><span class="st0">'l'</span>, <span class="co1">// C++11 允许额外的逗号</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 常量 d 为 0,常量 e 为 1,常量 f 为 3</span>
|
|
<span class="kw2">enum</span>
|
|
<span class="br0">{</span>
|
|
d,
|
|
e,
|
|
f <span class="sy1">=</span> e <span class="sy2">+</span> <span class="nu0">2</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 枚举类型(有作用域和无作用域)能有重载的运算符</span>
|
|
<a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&</span> operator<span class="sy1"><<</span><span class="br0">(</span><a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&</span> os, color c<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw1">switch</span><span class="br0">(</span>c<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw1">case</span> red <span class="sy4">:</span> os <span class="sy1"><<</span> <span class="st0">"red"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
|
|
<span class="kw1">case</span> yellow<span class="sy4">:</span> os <span class="sy1"><<</span> <span class="st0">"yellow"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
|
|
<span class="kw1">case</span> green <span class="sy4">:</span> os <span class="sy1"><<</span> <span class="st0">"green"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
|
|
<span class="kw1">case</span> blue <span class="sy4">:</span> os <span class="sy1"><<</span> <span class="st0">"blue"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
|
|
<span class="kw1">default</span> <span class="sy4">:</span> os.<span class="me1">setstate</span><span class="br0">(</span><a href="cpp-io-ios_base-iostate.html"><span class="kw1700">std::<span class="me2">ios_base</span><span class="sy4">::</span><span class="me2">failbit</span></span></a><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<span class="kw1">return</span> os<span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
|
|
<a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&</span> operator<span class="sy1"><<</span><span class="br0">(</span><a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&</span> os, altitude al<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw1">return</span> os <span class="sy1"><<</span> <span class="kw1">static_cast</span><span class="sy1"><</span><span class="kw4">char</span><span class="sy1">></span><span class="br0">(</span>al<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
|
|
<span class="co1">// 有作用域枚举(C++11)能部分地在早期 C++ 版本模拟:</span>
|
|
|
|
<span class="kw2">enum</span> <span class="kw1">struct</span> E11 <span class="br0">{</span> x, y <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// C++11 起</span>
|
|
|
|
<span class="kw1">struct</span> E98 <span class="br0">{</span> <span class="kw2">enum</span> <span class="br0">{</span> x, y <span class="br0">}</span><span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// C++11 前也 OK</span>
|
|
|
|
<span class="kw1">namespace</span> N98 <span class="br0">{</span> <span class="kw2">enum</span> <span class="br0">{</span> x, y <span class="br0">}</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// C++11 前也 OK</span>
|
|
|
|
<span class="kw1">struct</span> S98 <span class="br0">{</span> <span class="kw4">static</span> <span class="kw4">const</span> <span class="kw4">int</span> x <span class="sy1">=</span> <span class="nu0">0</span>, y <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// C++11 前也 OK</span>
|
|
|
|
<span class="kw4">void</span> emu<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"><<</span> <span class="br0">(</span><span class="kw1">static_cast</span><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span><span class="br0">(</span>E11<span class="sy4">::</span><span class="me2">y</span><span class="br0">)</span> <span class="sy2">+</span> E98<span class="sy4">::</span><span class="me2">y</span> <span class="sy2">+</span> N98<span class="sy4">::</span><span class="me2">y</span> <span class="sy2">+</span> S98<span class="sy4">::</span><span class="me2">y</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span> <span class="co1">// 4</span>
|
|
<span class="br0">}</span>
|
|
|
|
<span class="kw1">namespace</span> cxx20
|
|
<span class="br0">{</span>
|
|
<span class="kw2">enum</span> <span class="kw1">class</span> long_long_long_name <span class="br0">{</span> x, y <span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">void</span> using_enum_demo<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"><<</span> <span class="st0">"C++20 using enum: __cpp_using_enum == "</span><span class="sy4">;</span>
|
|
<span class="kw1">switch</span> <span class="br0">(</span><span class="kw4">auto</span> rnd <span class="sy1">=</span> <span class="br0">[</span><span class="br0">]</span><span class="br0">{</span><span class="kw1">return</span> long_long_long_name<span class="sy4">::</span><span class="me2">x</span><span class="sy4">;</span><span class="br0">}</span><span class="sy4">;</span> rnd<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="co2"># if defined(__cpp_using_enum)</span>
|
|
<span class="kw1">using</span> <span class="kw2">enum</span> long_long_long_name<span class="sy4">;</span>
|
|
<span class="kw1">case</span> x<span class="sy4">:</span> <a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> __cpp_using_enum <span class="sy1"><<</span> <span class="st0">"; x<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
|
|
<span class="kw1">case</span> y<span class="sy4">:</span> <a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> __cpp_using_enum <span class="sy1"><<</span> <span class="st0">"; y<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
|
|
<span class="co2"># else</span>
|
|
<span class="kw1">case</span> long_long_long_name<span class="sy4">::</span><span class="me2">x</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"><<</span> <span class="st0">"?; x<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
|
|
<span class="kw1">case</span> long_long_long_name<span class="sy4">::</span><span class="me2">y</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"><<</span> <span class="st0">"?; y<span class="es1">\n</span>"</span><span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span>
|
|
<span class="co2"># endif</span>
|
|
<span class="br0">}</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>
|
|
color col <span class="sy1">=</span> red<span class="sy4">;</span>
|
|
altitude a<span class="sy4">;</span>
|
|
a <span class="sy1">=</span> altitude<span class="sy4">::</span><span class="me2">low</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"><<</span> <span class="st0">"col = "</span> <span class="sy1"><<</span> col <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"a = "</span> <span class="sy1"><<</span> a <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"f = "</span> <span class="sy1"><<</span> f <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
cxx20<span class="sy4">::</span><span class="me2">using_enum_demo</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">col = red
|
|
a = l
|
|
f = 3
|
|
C++20 using enum: __cpp_using_enum == 201907; x</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E7.BC.BA.E9.99.B7.E6.8A.A5.E5.91.8A">缺陷报告</span></h3>
|
|
<p>下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。</p>
|
|
<table class="dsctable" style="font-size:0.8em">
|
|
<tr>
|
|
<th>DR</th>
|
|
<th>应用于</th>
|
|
<th>出版时的行为</th>
|
|
<th>正确行为</th>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue1638">CWG 1638</a></td>
|
|
<td>C++11</td>
|
|
<td>不可见枚举声明的文法禁止用于模板特化</td>
|
|
<td>容许嵌套类型说明符</td>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue1766">CWG 1766</a></td>
|
|
<td>C++98</td>
|
|
<td>从范围外的值转型到无固定底层类型的枚举拥有未指明的结果</td>
|
|
<td>行为未定义</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-types-is_enum.html"><span class="t-lines"><span>is_enum</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>检查类型是否是枚举类型<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-types-is_scoped_enum.html"><span class="t-lines"><span>is_scoped_enum</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx23">(C++23)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>检查类型是否为有作用域枚举类型<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-types-underlying_type.html"><span class="t-lines"><span>underlying_type</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>获取给定枚举类型的底层整数类型<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-to_underlying.html"><span class="t-lines"><span>to_underlying</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx23">(C++23)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>转换枚举到其底层类型<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|