L'utilisation de membres définis précédemment en tant que membres ultérieurs d'une définition d'enum est-elle légale?

StackOverflow https://stackoverflow.com/questions/1627479

  •  06-07-2019
  •  | 
  •  

Question

namespace ValueType {
  enum Enum {
    Boolean = 0,
    Float = 1,
    Double,
    SInt = 8,
    SLong,
    UInt = SInt + (1 <<4),
    ULong = SLong + (1 << 4)
  };
}
Était-ce utile?

La solution

Oui, l'exigence est qu'il s'agisse d'une expression constante intégrale. La norme C ++ inclut l'exemple suivant:

enum { d, e, f=e+2 };

Autres conseils

Comme indiqué par Jerry , c’est légal.

Dans de rares cas, il est conscient que le type des énumérateurs n’est spécifié que lorsque l’énumération est entièrement définie. La norme indique ce qui suit concernant le type des énumérations (7.2 / 4):

  

Chaque énumération définit un type différent de tous les autres types. Après l'accolade fermante d'un spécificateur d'énumération, chaque énumérateur a le type de son énumération. Avant l'accolade de fermeture, le type de chaque énumérateur est le type de sa valeur d'initialisation. Si un initialiseur est spécifié pour un énumérateur, la valeur d'initialisation a le même type que l'expression. Si aucun initialiseur n'est spécifié pour le premier énumérateur, le type est un type intégral non spécifié . Sinon, le type est identique à celui de la valeur d'initialisation de l'énumérateur précédent, à moins que la valeur incrémentée ne soit pas représentable dans ce type, auquel cas le type est un type entier non spécifié suffisant pour contenir la valeur incrémentée.

La phrase en surbrillance peut être montrée dans l'exemple suivant:

enum E {
  E0            // Unspecified type
  , E1 = E0-1   // -1, or MAX_UINT
  , E2          // 0 or (MAX_UINT+1)
};

En principe, le type choisi pour E0 affecte la valeur résultante de E1 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top