para - enum type c++ example
¿Es "clase enum" un tipo de clase en C++? (2)
A pesar de la palabra clave class
, las enumeraciones no son clases. Esa palabra clave solo significa que los enumeradores deben respetar ciertas reglas de alcance (y también previene las conversiones integrales implícitas).
La elección de la palabra clave se debe a los aspectos provocados por el nuevo tipo 1 y a la forma en que los enumeradores seleccionados 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 cual solo permitía acceder a los enumeradores a través del nombre calificado. Sin embargo, no evitó las conversiones implícitas, como las enumeraciones verdaderas.
is_class
está destinado a identificar los tipos agregados de clase / estructura.
Leí sobre la declaración de enumeración en C ++ utilizando cppreference .
Luego hice la clase Enum y verifico si es un tipo de clase o no usando std::is_class
.
#include <iostream>
enum class Enum
{
red = 1, blue, green
};
int main()
{
std::cout << std::boolalpha;
std::cout << std::is_class<Enum>::value << ''/n'';
}
Luego compilé y ejecuté el compilador G ++ en la plataforma Linux, imprime valores 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 usa para definir una enumeración con ámbito , que es una entidad completamente separada de una class
.
std::is_class
correctamente devuelve false
aquí. Si usa std::is_enum
, devolverá true
.
El tipo de enumeración declarado con una clave enum de solo
enum
es una enumeración sin ámbito, y sus enumeradores son enumeradores sin ámbito. Las enum-keysenum class
yenum struct
son semánticamente equivalentes; un tipo de enumeración declarado con uno de estos es una enumeración con ámbito, y sus enumeradores son enumeradores del ámbito.
No se menciona que una enum class
sea un "tipo de class
" en ninguna parte del Estándar.