enumeration declaration
An enumeration is a distinct type whose value is restricted to one of several explicitly named constants ("enumerators"). The values of the constants are values of an integral type known as the underlying type of the enumeration.
enum name : type attr { enumerator = constexpr , enumerator = constexpr , ... } | (1) | ||||||||
enum class name : type attr { enumerator = constexpr , enumerator = constexpr , ... } | (2) | (since C++11) | |||||||
enum struct name : type attr { enumerator = constexpr , enumerator = constexpr , ... } | (3) | (since C++11) | |||||||
1) declares an unscoped enumeration type. Each enumerator becomes accessible in the enclosing scope, and is implicitly-convertible to integral type, including bool. If not explicitly specified, the underlying type is an integral type capable of representing all enumerator values, which cannot be wider than int unless some constexpr evaluates to a constant that does not fit in an int
2-3) declares a scoped enumeration type. Each enumerator can only be accessed as name::enumerator. Conversion to integral types is possible with static_cast. If not explicitly specified, the underlying type is int.
[edit] Explanation
name | - | the name of the type declared by this declaration. An unscoped enumeration may be nameless, in which case it only introduces enumerator names as constants, but no new type |
type(C++11) | - | optional integral type (any cv-qualification is ignored), used as the underlying type of the enumeration. |
attr(C++11) | - | zero or more implementation-specific attributes of the form [[attribute]] |
enumerator | - | zero or more enumerators which are introduced by this declaration. The names of the enumerators may be used anywhere constants are expected |
constexpr | - | optional constant expression which evaluates to the value to be assigned to the enumerator. If it is omitted, the value is the value of the previous enumerator plus 1. If omitted for the first enumerator, the value is 0 |
This section is incomplete |
[edit] Example
#include <iostream> // color may be red (value 0), yellow (value 1), green (value 20), or blue (value 21) enum color { red, yellow, green = 20, blue }; // altitude may be altitude::high or altitude::low enum class altitude : char { high='h', low='l', // C++11 allows the extra comma }; // the constant d is 0, the constant e is 1, the constant f is 3 enum { d, e, f=e+2 }; int main() { color col = red; altitude a; a = altitude::low; std::cout << "red = " << col << " blue = " << blue << '\n' << "a = " << static_cast<char>(a) << '\n' << "f = " << f << '\n'; }
Output:
red = 0 blue = 21 a = l f = 3