◐ Shell
clean mode source ↗

std::underlying_type - cppreference.com

De cppreference.com

template< class T > struct underlying_type;

(desde C++11)

Si T es un tipo enumeración completo, proporciona una definición de tipo (typedef) miembro type que denomina el tipo subyaceente de T.

De lo contrario, el comportamiento está indefinido.

(hasta C++20)

De lo contrario, si T no es un tipo enumeración, no hay un miembro type. De lo contrario, (T es un tipo enumeración incompleto), el programa está mal formado.

(desde C++20)

El comportamiento de un programa que añade especializaciones para underlying_type no está definido.

Tipos miembro

Nombre Definición
type El tipo subyacente de T.

Tipos auxiliares

template< class T > using underlying_type_t = typename underlying_type<T>::type;

(desde C++14)

Notas

Cada tipo enumeración tiene un tipo subyacente, que puede ser

1. Especificado explícitamente (tanto enumeraciones con ámbito como sin ámbito).

2. Omitido, en cuyo caso es int para enumeraciones con ámbito o un tipo entero definido por la implementación capaz de representar todos los valores de la enumeración (para enumeraciones sin ámbito).

Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 2396 C++11 Se permitían los tipos enumeración incompletos Se requieren tipos enumeración completos

Ejemplo

#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
    << "el tipo subyacente de 'e1' es " << (e1_type?"unsigned":"no-unsigned") << '\n'
    << "el tipo subyacente de 'e2' es " << (e2_type?"int":"no-int") << '\n';
}

Salida:

el tipo subyacente de 'e1' es unsigned
el tipo subyacente de 'e2' es int