Init
This commit is contained in:
336
cppdraft/dcl/enum.md
Normal file
336
cppdraft/dcl/enum.md
Normal file
@@ -0,0 +1,336 @@
|
||||
[dcl.enum]
|
||||
|
||||
# 9 Declarations [[dcl]](./#dcl)
|
||||
|
||||
## 9.8 Enumerations [[enum]](enum#dcl.enum)
|
||||
|
||||
### 9.8.1 Enumeration declarations [dcl.enum]
|
||||
|
||||
[1](#1)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L7788)
|
||||
|
||||
An enumeration is a distinct type ([[basic.compound]](basic.compound "6.9.4 Compound types")) with named
|
||||
constants[.](#1.sentence-1)
|
||||
|
||||
Its name becomes an [*enum-name*](#nt:enum-name "9.8.1 Enumeration declarations [dcl.enum]") within its scope[.](#1.sentence-2)
|
||||
|
||||
[enum-name:](#nt:enum-name "9.8.1 Enumeration declarations [dcl.enum]")
|
||||
[*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]")
|
||||
|
||||
[enum-specifier:](#nt:enum-specifier "9.8.1 Enumeration declarations [dcl.enum]")
|
||||
[*enum-head*](#nt:enum-head "9.8.1 Enumeration declarations [dcl.enum]") { [*enumerator-list*](#nt:enumerator-list "9.8.1 Enumeration declarations [dcl.enum]")opt }
|
||||
[*enum-head*](#nt:enum-head "9.8.1 Enumeration declarations [dcl.enum]") { [*enumerator-list*](#nt:enumerator-list "9.8.1 Enumeration declarations [dcl.enum]") , }
|
||||
|
||||
[enum-head:](#nt:enum-head "9.8.1 Enumeration declarations [dcl.enum]")
|
||||
[*enum-key*](#nt:enum-key "9.8.1 Enumeration declarations [dcl.enum]") [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt [*enum-head-name*](#nt:enum-head-name "9.8.1 Enumeration declarations [dcl.enum]")opt [*enum-base*](#nt:enum-base "9.8.1 Enumeration declarations [dcl.enum]")opt
|
||||
|
||||
[enum-head-name:](#nt:enum-head-name "9.8.1 Enumeration declarations [dcl.enum]")
|
||||
[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]")opt [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]")
|
||||
|
||||
[opaque-enum-declaration:](#nt:opaque-enum-declaration "9.8.1 Enumeration declarations [dcl.enum]")
|
||||
[*enum-key*](#nt:enum-key "9.8.1 Enumeration declarations [dcl.enum]") [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt [*enum-head-name*](#nt:enum-head-name "9.8.1 Enumeration declarations [dcl.enum]") [*enum-base*](#nt:enum-base "9.8.1 Enumeration declarations [dcl.enum]")opt ;
|
||||
|
||||
[enum-key:](#nt:enum-key "9.8.1 Enumeration declarations [dcl.enum]")
|
||||
enum
|
||||
enum class
|
||||
enum struct
|
||||
|
||||
[enum-base:](#nt:enum-base "9.8.1 Enumeration declarations [dcl.enum]")
|
||||
: [*type-specifier-seq*](dcl.type.general#nt:type-specifier-seq "9.2.9.1 General [dcl.type.general]")
|
||||
|
||||
[enumerator-list:](#nt:enumerator-list "9.8.1 Enumeration declarations [dcl.enum]")
|
||||
[*enumerator-definition*](#nt:enumerator-definition "9.8.1 Enumeration declarations [dcl.enum]")
|
||||
[*enumerator-list*](#nt:enumerator-list "9.8.1 Enumeration declarations [dcl.enum]") , [*enumerator-definition*](#nt:enumerator-definition "9.8.1 Enumeration declarations [dcl.enum]")
|
||||
|
||||
[enumerator-definition:](#nt:enumerator-definition "9.8.1 Enumeration declarations [dcl.enum]")
|
||||
[*enumerator*](#nt:enumerator "9.8.1 Enumeration declarations [dcl.enum]")
|
||||
[*enumerator*](#nt:enumerator "9.8.1 Enumeration declarations [dcl.enum]") = [*constant-expression*](expr.const#nt:constant-expression "7.7 Constant expressions [expr.const]")
|
||||
|
||||
[enumerator:](#nt:enumerator "9.8.1 Enumeration declarations [dcl.enum]")
|
||||
[*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt
|
||||
|
||||
The optional [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]") in the [*enum-head*](#nt:enum-head "9.8.1 Enumeration declarations [dcl.enum]") and
|
||||
the [*opaque-enum-declaration*](#nt:opaque-enum-declaration "9.8.1 Enumeration declarations [dcl.enum]") appertains to the enumeration; the attributes
|
||||
in that [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]") are thereafter considered attributes of the
|
||||
enumeration whenever it is named[.](#1.sentence-3)
|
||||
|
||||
A : following
|
||||
âenum [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]")opt [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]")â
|
||||
within the [*decl-specifier-seq*](dcl.spec.general#nt:decl-specifier-seq "9.2.1 General [dcl.spec.general]") of a [*member-declaration*](class.mem.general#nt:member-declaration "11.4.1 General [class.mem.general]") is parsed as part of an [*enum-base*](#nt:enum-base "9.8.1 Enumeration declarations [dcl.enum]")[.](#1.sentence-4)
|
||||
|
||||
[*Note [1](#note-1)*:
|
||||
|
||||
This resolves a potential ambiguity between the declaration of an enumeration
|
||||
with an [*enum-base*](#nt:enum-base "9.8.1 Enumeration declarations [dcl.enum]") and the declaration of an unnamed bit-field of enumeration
|
||||
type[.](#1.sentence-5)
|
||||
|
||||
[*Example [1](#example-1)*: struct S {enum E : int {}; enum E : int {}; // error: redeclaration of enumeration}; â *end example*]
|
||||
|
||||
â *end note*]
|
||||
|
||||
The [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") in an [*enum-head-name*](#nt:enum-head-name "9.8.1 Enumeration declarations [dcl.enum]") is not looked up and is introduced by
|
||||
the [*enum-specifier*](#nt:enum-specifier "9.8.1 Enumeration declarations [dcl.enum]") or [*opaque-enum-declaration*](#nt:opaque-enum-declaration "9.8.1 Enumeration declarations [dcl.enum]")[.](#1.sentence-6)
|
||||
|
||||
If the [*enum-head-name*](#nt:enum-head-name "9.8.1 Enumeration declarations [dcl.enum]") of an [*opaque-enum-declaration*](#nt:opaque-enum-declaration "9.8.1 Enumeration declarations [dcl.enum]") contains
|
||||
a [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]"),
|
||||
the declaration shall be an [explicit specialization](temp.expl.spec "13.9.4 Explicit specialization [temp.expl.spec]")[.](#1.sentence-7)
|
||||
|
||||
[2](#2)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L7875)
|
||||
|
||||
The enumeration type declared with an [*enum-key*](#nt:enum-key "9.8.1 Enumeration declarations [dcl.enum]") of only enum is an [*unscoped enumeration*](#def:enumeration,unscoped "9.8.1 Enumeration declarations [dcl.enum]"),
|
||||
and its [*enumerator*](#nt:enumerator "9.8.1 Enumeration declarations [dcl.enum]")*s* are [*unscoped enumerators*](#def:enumerator,unscoped "9.8.1 Enumeration declarations [dcl.enum]")[.](#2.sentence-1)
|
||||
|
||||
The [*enum-key*](#nt:enum-key "9.8.1 Enumeration declarations [dcl.enum]")*s* enum class andenum struct are semantically equivalent; an enumeration
|
||||
type declared with one of these is a [*scoped enumeration*](#def:enumeration,scoped "9.8.1 Enumeration declarations [dcl.enum]"),
|
||||
and its [*enumerator*](#nt:enumerator "9.8.1 Enumeration declarations [dcl.enum]")*s* are [*scoped enumerators*](#def:enumerator,scoped "9.8.1 Enumeration declarations [dcl.enum]")[.](#2.sentence-2)
|
||||
|
||||
The optional [*enum-head-name*](#nt:enum-head-name "9.8.1 Enumeration declarations [dcl.enum]") shall not be omitted in the declaration of a scoped enumeration[.](#2.sentence-3)
|
||||
|
||||
The [*type-specifier-seq*](dcl.type.general#nt:type-specifier-seq "9.2.9.1 General [dcl.type.general]") of an [*enum-base*](#nt:enum-base "9.8.1 Enumeration declarations [dcl.enum]") shall name an integral type; any cv-qualification is ignored[.](#2.sentence-4)
|
||||
|
||||
An [*opaque-enum-declaration*](#nt:opaque-enum-declaration "9.8.1 Enumeration declarations [dcl.enum]") declaring an unscoped enumeration shall
|
||||
not omit the [*enum-base*](#nt:enum-base "9.8.1 Enumeration declarations [dcl.enum]")[.](#2.sentence-5)
|
||||
|
||||
The identifiers in an [*enumerator-list*](#nt:enumerator-list "9.8.1 Enumeration declarations [dcl.enum]") are declared as
|
||||
constants, and can appear wherever constants are required[.](#2.sentence-6)
|
||||
|
||||
The same identifier shall not appear as
|
||||
the name of multiple enumerators in an [*enumerator-list*](#nt:enumerator-list "9.8.1 Enumeration declarations [dcl.enum]")[.](#2.sentence-7)
|
||||
|
||||
An [*enumerator-definition*](#nt:enumerator-definition "9.8.1 Enumeration declarations [dcl.enum]") with = gives the associated[*enumerator*](#nt:enumerator "9.8.1 Enumeration declarations [dcl.enum]") the value indicated by the[*constant-expression*](expr.const#nt:constant-expression "7.7 Constant expressions [expr.const]")[.](#2.sentence-8)
|
||||
|
||||
An [*enumerator-definition*](#nt:enumerator-definition "9.8.1 Enumeration declarations [dcl.enum]") without = gives the associated[*enumerator*](#nt:enumerator "9.8.1 Enumeration declarations [dcl.enum]") the value zero
|
||||
if it is the first [*enumerator-definition*](#nt:enumerator-definition "9.8.1 Enumeration declarations [dcl.enum]"),
|
||||
and the value of the previous [*enumerator*](#nt:enumerator "9.8.1 Enumeration declarations [dcl.enum]") increased by one otherwise[.](#2.sentence-9)
|
||||
|
||||
[*Example [2](#example-2)*:
|
||||
|
||||
enum { a, b, c=0 };enum { d, e, f=e+2 }; defines a, c, and d to be zero, b ande to be 1, and f to be 3[.](#2.sentence-10)
|
||||
|
||||
â *end example*]
|
||||
|
||||
The optional [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]") in an[*enumerator*](#nt:enumerator "9.8.1 Enumeration declarations [dcl.enum]") appertains to that enumerator[.](#2.sentence-11)
|
||||
|
||||
[3](#3)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L7913)
|
||||
|
||||
An [*opaque-enum-declaration*](#nt:opaque-enum-declaration "9.8.1 Enumeration declarations [dcl.enum]") is either a redeclaration
|
||||
of an enumeration in the current scope or a declaration of a new enumeration[.](#3.sentence-1)
|
||||
|
||||
[*Note [2](#note-2)*:
|
||||
|
||||
An enumeration declared by an[*opaque-enum-declaration*](#nt:opaque-enum-declaration "9.8.1 Enumeration declarations [dcl.enum]") has a fixed underlying type and is a
|
||||
complete type[.](#3.sentence-2)
|
||||
|
||||
The list of enumerators can be provided in a later redeclaration
|
||||
with an [*enum-specifier*](#nt:enum-specifier "9.8.1 Enumeration declarations [dcl.enum]")[.](#3.sentence-3)
|
||||
|
||||
â *end note*]
|
||||
|
||||
A scoped enumeration
|
||||
shall not be later redeclared as unscoped or with a different underlying type[.](#3.sentence-4)
|
||||
|
||||
An unscoped enumeration shall not be later redeclared as scoped and each
|
||||
redeclaration shall include an [*enum-base*](#nt:enum-base "9.8.1 Enumeration declarations [dcl.enum]") specifying the same
|
||||
underlying type as in the original declaration[.](#3.sentence-5)
|
||||
|
||||
[4](#4)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L7928)
|
||||
|
||||
If an [*enum-head-name*](#nt:enum-head-name "9.8.1 Enumeration declarations [dcl.enum]") contains a[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]"),
|
||||
the enclosing [*enum-specifier*](#nt:enum-specifier "9.8.1 Enumeration declarations [dcl.enum]") or [*opaque-enum-declaration*](#nt:opaque-enum-declaration "9.8.1 Enumeration declarations [dcl.enum]") D shall not inhabit a class scope and
|
||||
shall correspond to one or more declarations nominable
|
||||
in the class, class template, or namespace
|
||||
to which the [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]") refers ([[basic.scope.scope]](basic.scope.scope "6.4.1 General"))[.](#4.sentence-1)
|
||||
|
||||
All those declarations shall have the same target scope;
|
||||
the target scope of D is that scope[.](#4.sentence-2)
|
||||
|
||||
[5](#5)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L7940)
|
||||
|
||||
Each enumeration defines a type that is different from all other types[.](#5.sentence-1)
|
||||
|
||||
Each enumeration also has an [*underlying type*](#def:type,underlying,enumeration "9.8.1 Enumeration declarations [dcl.enum]")[.](#5.sentence-2)
|
||||
|
||||
The underlying type can be explicitly specified using an [*enum-base*](#nt:enum-base "9.8.1 Enumeration declarations [dcl.enum]")[.](#5.sentence-3)
|
||||
|
||||
For a scoped enumeration type, the underlying type is int if it is not
|
||||
explicitly specified[.](#5.sentence-4)
|
||||
|
||||
In both of these cases, the underlying type is said to be[*fixed*](#def:type,underlying,fixed "9.8.1 Enumeration declarations [dcl.enum]")[.](#5.sentence-5)
|
||||
|
||||
Following the closing brace of an [*enum-specifier*](#nt:enum-specifier "9.8.1 Enumeration declarations [dcl.enum]"), each
|
||||
enumerator has the type of its enumeration[.](#5.sentence-6)
|
||||
|
||||
If the underlying type is fixed, the type of each enumerator
|
||||
prior to the closing brace is the underlying
|
||||
type
|
||||
and the [*constant-expression*](expr.const#nt:constant-expression "7.7 Constant expressions [expr.const]") in the [*enumerator-definition*](#nt:enumerator-definition "9.8.1 Enumeration declarations [dcl.enum]") shall be a[converted constant expression](expr.const#def:expression,converted_constant "7.7 Constant expressions [expr.const]") of the underlying type[.](#5.sentence-7)
|
||||
|
||||
If the underlying
|
||||
type is not fixed,
|
||||
the type of each enumerator prior to the closing brace is determined as
|
||||
follows:
|
||||
|
||||
- [(5.1)](#5.1)
|
||||
|
||||
If an
|
||||
initializer is specified for an enumerator, the[*constant-expression*](expr.const#nt:constant-expression "7.7 Constant expressions [expr.const]") shall be an[integral constant expression](expr.const#def:expression,integral_constant "7.7 Constant expressions [expr.const]")[.](#5.1.sentence-1)
|
||||
If the expression has
|
||||
unscoped enumeration type, the enumerator has the underlying type of that
|
||||
enumeration type, otherwise it has the same type as the expression[.](#5.1.sentence-2)
|
||||
|
||||
- [(5.2)](#5.2)
|
||||
|
||||
If no initializer is specified for the
|
||||
first enumerator, its type is an unspecified signed integral type[.](#5.2.sentence-1)
|
||||
|
||||
- [(5.3)](#5.3)
|
||||
|
||||
Otherwise
|
||||
the type of the enumerator is the same as that of the
|
||||
preceding enumerator unless the incremented value is not representable
|
||||
in that type, in which case the type is an unspecified integral type
|
||||
sufficient to contain the incremented value[.](#5.3.sentence-1)
|
||||
If no such type exists, the program
|
||||
is ill-formed[.](#5.3.sentence-2)
|
||||
|
||||
[6](#6)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L7982)
|
||||
|
||||
An enumeration whose underlying type is fixed is an incomplete type
|
||||
until immediately after its[*enum-base*](#nt:enum-base "9.8.1 Enumeration declarations [dcl.enum]") (if any), at which point it becomes a complete type[.](#6.sentence-1)
|
||||
|
||||
An enumeration whose underlying type is not fixed is an incomplete type
|
||||
until the closing } of its[*enum-specifier*](#nt:enum-specifier "9.8.1 Enumeration declarations [dcl.enum]"), at which point it becomes a complete type[.](#6.sentence-2)
|
||||
|
||||
[7](#7)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L7990)
|
||||
|
||||
For an enumeration whose underlying type is not fixed,
|
||||
the underlying type
|
||||
is an
|
||||
integral type that can represent all the enumerator values defined in
|
||||
the enumeration[.](#7.sentence-1)
|
||||
|
||||
If no integral type can represent all the enumerator
|
||||
values, the enumeration is ill-formed[.](#7.sentence-2)
|
||||
|
||||
It is implementation-defined
|
||||
which integral type is used as the underlying type
|
||||
except that the underlying type shall not be larger than int unless the value of an enumerator cannot fit in an int orunsigned int[.](#7.sentence-3)
|
||||
|
||||
If the [*enumerator-list*](#nt:enumerator-list "9.8.1 Enumeration declarations [dcl.enum]") is empty, the
|
||||
underlying type is as if the enumeration had a single enumerator with
|
||||
value 0[.](#7.sentence-4)
|
||||
|
||||
[8](#8)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L8004)
|
||||
|
||||
For an enumeration whose underlying type is fixed, the values of
|
||||
the enumeration are the values of the underlying type[.](#8.sentence-1)
|
||||
|
||||
Otherwise,
|
||||
the values of the enumeration are the values representable by
|
||||
a hypothetical integer type with minimal width M such that all enumerators can be represented[.](#8.sentence-2)
|
||||
|
||||
The width of the smallest bit-field large enough to hold all the values of the
|
||||
enumeration type is M[.](#8.sentence-3)
|
||||
|
||||
It is possible to define an enumeration that has values not defined by
|
||||
any of its enumerators[.](#8.sentence-4)
|
||||
|
||||
If the [*enumerator-list*](#nt:enumerator-list "9.8.1 Enumeration declarations [dcl.enum]") is empty, the
|
||||
values of the enumeration are as if the enumeration had a single enumerator with
|
||||
value 0[.](#8.sentence-5)[82](#footnote-82 "This set of values is used to define promotion and conversion semantics for the enumeration type. It does not preclude an expression of enumeration type from having a value that falls outside this range.")
|
||||
|
||||
[9](#9)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L8024)
|
||||
|
||||
An enumeration has
|
||||
the same size,
|
||||
value representation, and
|
||||
alignment requirements ([[basic.align]](basic.align "6.8.3 Alignment"))
|
||||
as its underlying type[.](#9.sentence-1)
|
||||
|
||||
Furthermore, each value of an enumeration has the same representation
|
||||
as the corresponding value of the underlying type[.](#9.sentence-2)
|
||||
|
||||
[10](#10)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L8033)
|
||||
|
||||
Two enumeration types are [*layout-compatible enumerations*](#def:layout-compatible,enumeration "9.8.1 Enumeration declarations [dcl.enum]") if they have the same underlying type[.](#10.sentence-1)
|
||||
|
||||
[11](#11)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L8037)
|
||||
|
||||
The value of an enumerator or an object of an unscoped enumeration type is
|
||||
converted to an integer by [integral promotion](conv.prom#def:integral_promotion "7.3.7 Integral promotions [conv.prom]")[.](#11.sentence-1)
|
||||
|
||||
[*Example [3](#example-3)*:
|
||||
|
||||
enum color { red, yellow, green=20, blue };
|
||||
color col = red;
|
||||
color* cp = &col;if (*cp == blue) // ... makes color a type describing various colors, and then declarescol as an object of that type, and cp as a pointer to an
|
||||
object of that type[.](#11.sentence-2)
|
||||
|
||||
The possible values of an object of typecolor are red, yellow, green,blue; these values can be converted to the integral values0, 1, 20, and 21[.](#11.sentence-3)
|
||||
|
||||
Since enumerations are
|
||||
distinct types, objects of type color can be assigned only
|
||||
values of type color[.](#11.sentence-4)
|
||||
|
||||
color c = 1; // error: type mismatch, no conversion from int to colorint i = yellow; // OK, yellow converted to integral value 1, integral promotion
|
||||
|
||||
Note that this implicit enum to int conversion is not provided for a scoped enumeration:enum class Col { red, yellow, green };int x = Col::red; // error: no Col to int conversion Col y = Col::red;if (y) { } // error: no Col to bool conversion
|
||||
|
||||
â *end example*]
|
||||
|
||||
[12](#12)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L8069)
|
||||
|
||||
The name of each unscoped enumerator is also bound
|
||||
in the scope that immediately contains the [*enum-specifier*](#nt:enum-specifier "9.8.1 Enumeration declarations [dcl.enum]")[.](#12.sentence-1)
|
||||
|
||||
An unnamed enumeration
|
||||
that does not have a typedef name for linkage purposes ([[dcl.typedef]](dcl.typedef "9.2.4 The typedef specifier")) and
|
||||
that has a first enumerator
|
||||
is denoted, for linkage purposes ([[basic.link]](basic.link "6.7 Program and linkage")),
|
||||
by its underlying type and its first enumerator;
|
||||
such an enumeration is said to have
|
||||
an enumerator as a name for linkage purposes[.](#12.sentence-2)
|
||||
|
||||
[*Note [3](#note-3)*:
|
||||
|
||||
Each unnamed enumeration with no enumerators is a distinct type[.](#12.sentence-3)
|
||||
|
||||
â *end note*]
|
||||
|
||||
[*Example [4](#example-4)*: enum direction { left='l', right='r' };
|
||||
|
||||
void g() { direction d; // OK d = left; // OK d = direction::right; // OK}enum class altitude { high='h', low='l' };
|
||||
|
||||
void h() { altitude a; // OK a = high; // error: high not in scope a = altitude::low; // OK} â *end example*]
|
||||
|
||||
[82)](#footnote-82)[82)](#footnoteref-82)
|
||||
|
||||
This set of values is used to define promotion and
|
||||
conversion semantics for the enumeration type[.](#footnote-82.sentence-1)
|
||||
|
||||
It does not preclude an
|
||||
expression of enumeration type from having a value that falls outside
|
||||
this range[.](#footnote-82.sentence-2)
|
||||
Reference in New Issue
Block a user