As classes enum ("novos enums", "enums fortes") abordam três problemas com enumerações C ++ tradicionais:
- convencional
enums
implicitamente converter em int
, causando erros quando alguém não deseja que uma enumeração atue como um inteiro.
- convencional
enums
exportar seus enumeradores para o escopo circundante, causando conflitos de nome.
- O tipo subjacente de an
enum
não pode ser especificado, causando confusão, problemas de compatibilidade e impossibilitando a declaração de encaminhamento.
enum class
("enums fortes") são fortemente tipados e com escopo definido:
enum Alert { green, yellow, orange, red };
enum class Color { red, blue };
enum class TrafficLight { red, yellow, green };
Alert a = 7;
Color c = 7;
int a2 = red;
int a3 = Alert::red;
int a4 = blue;
int a5 = Color::blue;
Color a6 = Color::blue;
Conforme mostrado, enums tradicionais funcionam como de costume, mas agora você pode se qualificar opcionalmente com o nome do enum.
Os novos enums são "classe enum" porque combinam aspectos de enumerações tradicionais (valores de nomes) com aspectos de classes (membros com escopo definido e ausência de conversões).
Ser capaz de especificar o tipo subjacente permite uma interoperabilidade mais simples e tamanhos garantidos de enumerações:
enum class Color : char { red, blue };
enum class TrafficLight { red, yellow, green };
enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U };
enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U };
Ele também permite a declaração de enums:
enum class Color_code : char;
void foobar(Color_code* p);
enum class Color_code : char { red, yellow, green, blue };
O tipo subjacente deve ser um dos tipos inteiros assinados ou não assinados; o padrão é int
.
Na biblioteca padrão, as enum
classes são usadas para:
- Códigos de sistemas de mapeamento específicos do erro: Em
<system_error>
: enum class errc
;
- Indicadores de segurança do ponteiro: Em
<memory>
:enum class pointer_safety { relaxed, preferred, strict };
- Erros de fluxo de E / S: Em
<iosfwd>
:enum class io_errc { stream = 1 };
- Tratamento de erros de comunicação assíncrona: Em
<future>
:enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
Vários deles têm operadores, conforme ==
definido.
enum class Colours
eenum class Fruits
. Porque quando escrevi o código no VS 2010. Ele lança um erro"expects a defination or a tag name"
emclass
.