std::underlying_type - cppreference.com

##### cppreference.com

##### Search

Create account

##### Namespaces

- Page
- Discussion

##### Variants

##### Views

- View
- Edit
- History

##### Actions

# std::underlying_type

From cppreference.com
< cpp‎ | types

Defined in header `<type_traits>` |  |
template< class T > struct underlying_type; |  | (since C++11)

If `T` is a complete (since C++17) enumeration type, provides a member typedef `type` that names the underlying type of `T`.

Otherwise, the behavior is undefined.

### [edit] Member types

Name | Definition
`type` | the underlying type of `T`

### [edit] Helper types

template< class T > using underlying_type_t = typename underlying_type<T>::type; |  | (since C++14)

### [edit] Notes

Each enumeration type has an underlying type, which can be

1. Specified explicitly (both scoped and unscoped enumerations)

2. Omitted, in which case it is int for scoped enumerations or an implementation-defined integral type capable of representing all values of the enum (for unscoped enumerations)

### [edit] Example

Run this code

    #include <iostream>
    #include <type_traits>

    enum e1 {};
    enum class e2: int {};

    int main() {
        bool e1_type = std::is_same<
            unsigned
           ,typename std::underlying_type<e1>::type
        >::value;

        bool e2_type = std::is_same<
            int
           ,typename std::underlying_type<e2>::type
        >::value;

        std::cout
        << "underlying type for 'e1' is " << (e1_type?"unsigned":"non-unsigned") << '\n'
        << "underlying type for 'e2' is " << (e2_type?"int":"non-int") << '\n';
    }

Output:

    underlying type for 'e1' is unsigned
    underlying type for 'e2' is int

Retrieved from "http://en.cppreference.com/mwiki/index.php?title=cpp/types/underlying_type&oldid=81799"