Leí sobre la statement de enumeración en C ++ usando cppreference .
Luego he hecho la clase Enum y verifico si es un tipo de clase o no usando std::is_class
.
#include enum class Enum { red = 1, blue, green }; int main() { std::cout << std::boolalpha; std::cout << std::is_class::value << '\n'; }
Luego compilé y ejecuté el comstackdor G ++ en la plataforma Linux, imprime valor false
.
Entonces, ¿es el tipo de clase enum
o no? Si enum es un tipo de clase, ¿por qué obtengo un valor falso ?
enum class
no es una definición de class
; la combinación de palabras clave se utiliza para definir una enumeración de ámbito , que es una entidad completamente separada de una class
.
std::is_class
devuelve correctamente false
aquí. Si usa std::is_enum
, devolverá true
.
De la norma :
El tipo de enumeración declarado con una clave de
enum
de soloenum
es una enumeración sin ámbito, y sus enumeradores son enumeradores sin ámbito. La enum-keysenum class
yenum struct
son semánticamente equivalentes; un tipo de enumeración declarado con uno de estos es una enumeración de ámbito, y sus enumeradores son enumeradores de ámbito.
No se menciona que una enum class
sea un “tipo de class
“ en ninguna parte del Estándar.
A pesar de la palabra clave de class
, las enumeraciones no son clases. Esa palabra clave solo significa que los enumeradores deben respetar ciertas reglas de scope (y también evita las conversiones integrales implícitas).
La elección de la palabra clave se debe a los aspectos provocados por el nuevo tipo 1 y la forma en que los enumeradores de ámbito se piratearon en la era anterior a C ++ 11 para obtener dichos aspectos:
struct Enum { // could just as well be a class. enum { red = 1, blue, green }; };
Lo que solo permitía el acceso a los enumeradores a través del nombre calificado. Aunque no impidió las conversiones implícitas como lo hacen las verdaderas enumeraciones de ámbito.
is_class
está destinado a identificar los tipos agregados de clase / estructura.
1 B. Stroustrup – C ++ 11 Preguntas frecuentes