Enumérations

Définition par le mot clé enum.
Les éléments de l'énumération sont dans le même espace de nommage que l'enum elle-même, on ne peut donc pas avoir deux éléments de même nom dans deux énums différentes du même espace de nommage.
Si on n'affecte pas explicitement une valeur aux éléments, le premier vaut automatiquement 0. Les suivants sont des entiers incrémentés.

Exemple :

enum Couleur   // Définition d'une enum
{
CLR_NOIR = 1,
CLR_ROUGE,  // vaut 2
CLR_VERT,  // vaut 3, etc.
CLR_BLEU,
CLR_BLANC
};

// Définition d'une variable
Couleur peinture {CLR_BLANC};

// Conversion en int
int n = CLR_NOIR;
Couleur c = 2; // interdit : provoque une erreur
Couleur cc = static_cast<Couleur>(2);  // OK mais non recommandé

Classes d'énumérations

Définies par le mot clé enum class.
Fonctionne de la même manière à une différence près : l'énumération crée un espace de nommage qui contient ses éléments.
De cette façon, on ne peut pas accidentellement comparer des éléments de deux énum différentes.
Exemple :

enum class Etat
{
OUVERT,
FERME,
INCONNU
};

Etat e{Etat::FERME};  // Utilise le nom complet