Espacios de nombres
Variantes
Acciones

std::underlying_type

De cppreference.com
< cpp‎ | types
 
 
Biblioteca de servicios
 
Apoyo de tipos
Tipos básicos
Tipos fundamentales
Tipos enteros de anchura fija (C++11)
Límites numéricos
Interfaz de C de límites numéricos
Información de tipo
en tiempo de ejecución
Rasgos de tipos
Categorías de tipos
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Propiedades de tipos
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(hasta C++20)
(C++11)(en desuso en C++20)
(C++11)
Constantes de rasgos de tipos
Metafunciones
(C++17)
Contexto de evaluación constante
Operaciones soportadas
Relaciones y consultas de propiedades
Modificaciones de tipos
(C++11)(C++11)(C++11)
Transformaciones de tipos
(C++11)
(C++11)
(C++17)
underlying_type
(C++11)
(C++11)(hasta C++20)(C++17)
 
Definido en el archivo de encabezado <type_traits>
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.

Contenido

[editar] Tipos miembro

Nombre Definición
type El tipo subyacente de T.

[editar] Tipos auxiliares

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

[editar] 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).

[editar] 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

[editar] 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