Considérez l'extrait de code :
enum class Color : char { red = 0x1, yellow = 0x2 }; char *data = ReadFile(); Color color = static_cast<Color>(data[0]);
Que se passe-t-il quand data[0] vaut 100 ? Selon les normes C 11 et C 14, la valeur résultante n'est pas spécifiée, ce qui signifie qu'elle peut être n'importe quoi.
Cependant , après CWG 1766, la conversion d'une valeur en dehors de la plage de l'énumération en type enum peut désormais invoquer Undefined Comportement (UB). Ce changement n'affecte que les implémentations du compilateur qui choisissent d'appliquer le défaut à leurs modes de compilation C 11 et C 14.
Dans un commutateur instruction, la condition est convertie en un type intégral. Pour les énumérations sans portée, cette conversion s'applique aux entiers ; pour les énumérations étendues (classe enum et structure enum), aucune promotion n'a lieu. Quoi qu'il en soit, la valeur de la condition se situe dans la plage du type et de l'int sous-jacents, donc l'étiquette par défaut doit toujours être utilisée.
Pour énumérations sans type sous-jacent fixe, la conversion de valeurs en dehors de la plage peut entraîner un comportement non spécifié (avant CWG 1766) ou UB (après GTC 1766). Ceci est illustré par l'énumération ColorUnfixed :
enum ColorUnfixed { red = 0x1, yellow = 0x2 };
Étant donné que le type sous-jacent n'est pas fixe, la plage de ColorUnfixed est de 0 à 3, ce qui fait de 100 une valeur invalide.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!