2017-07-13 4 views
4

Quel est le type de constante d'énumération lorsqu'elle est utilisée en dehors d'une définition d'énumération non délimitée?L'énumérateur utilisé dans l'expression a-t-il le même type que le type sous-jacent de son énumération?

Considérez le code suivant:

#include <iostream> 

enum modes 
{ 
    begin = 0, 
    end = 1 
}; 

int main() 
{ 
    std::cout << std::boolalpha 
     << std::is_same<unsigned int, typename std::underlying_type<modes>::type>::value 
     << std::endl; 
    std::cout << sizeof(modes) << std::endl; 
    std::cout << (-100 + end) << std::endl; 
} 

Cela donne sur ma machine:

true 
4 
-99 

Maintenant, si je change seulement la valeur d'une autre recenseur, begin à 2147483648, ma sortie devient:

true 
4 
4294967197 

Apparemment, cela signifie que le type de end est passé de int à unsigned int, même le type sous-jacent de modes est toujours le même (c.-à-d. unsigned int).

Existe-t-il des règles spéciales pour les promotions intégrales concernant les enums?

Répondre

7

de la norme C++ (7,2 déclarations d'énumération)

  1. ... Suite à l'accolade de fermeture d'un enum-spécificateur, chaque énumérateur a le type de son énumération . ...

Et (4.5 promotions intégrale)

3 A prvalue d'un type d'énumération dont le type sous-jacent sans portée est pas fixe (7.2) peut être converti en un prvalue du premier des types suivants pouvant représenter toutes les valeurs de l'énumération (c'est-à-dire, les valeurs comprises entre bmin et bmax comme décrit au 7.2): int, unsigned int, long int, unsigned long int, long long int, ou non signé long long int. Si aucun des types dans cette liste ne peut représenter toutes les valeurs de l'énumération, une prvalue d'un type d'énumération non délimitée peut être convertie en une prvalue du type entier étendu avec le rang de conversion entier le plus bas (4.13) supérieur au classement de long long en dont toutes les valeurs de l'énumération peuvent être représentées. S'il y a deux types étendus, le type signé est choisi.

+1

"peut être converti en une prvalue du premier des types suivants pouvant représenter toutes les valeurs de l'énumération". C'est précisément ce que je cherchais. Je vous remercie. –

2

Quel est le type de constante d'énumération, lorsqu'il est utilisé en dehors de la définition enum sans portée?

C'est le type d'énumération, bien sûr. Le type de begin est modes. Si elle avait un type intégral, votre question concernant les promotions intégrales d'enums n'aurait pas de sens.

Existe-t-il des règles spéciales pour les promotions intégrales avec enums?

Pas vraiment.Vous pensez à des promotions intégrales du type sous-jacent de l'enum, mais c'est quelque chose de différent. Pour le type enum lui-même, vous devez penser à la plage de valeurs valides du type enum, qui peut être inférieure à la plage de valeurs valides du type sous-jacent de l'enum. Est-ce que int peut représenter toutes les valeurs valides? Si c'est le cas, vous obtenez un int.