The type of a C++ enum is the enum itself. Its range is rather arbitrary, but in practical terms, its underlying type is an int
.
It is implicitly cast to int
wherever it’s used, though.
C++11 changes
This has changed since C++11, which introduced typed enums. An untyped enum
now is defined as being at least the width of int
(and wider if larger values are needed). However, given a typed enum
defined as follows:
enum name : type {};
An enumeration of type name
has an underlying type of type
. For example, enum : char
defines an enum
the same width as char
instead of int
.
Further, an enum
can be explicitly scoped as follows:
enum class name : type {
value = 0,
// ...
};
(Where name
is required, but type
is optional.) An enum
declared this way will no longer implicitly cast to its underlying type (requiring a static_cast<>
) and values must be referenced with a fully-qualified name. In this example, to assign value
to a enum
variable, you must refer to it as name::value
.