La promotion (intégrale) est préférée à d'autres conversions (intégrales) par résolution des surcharges
Classement des séquences de conversion implicites
1) Correspondance exacte : aucune conversion requise, conversion de lvalue à rvalue, conversion de qualification, conversion de pointeur de fonction, (depuis C++17) conversion définie par l'utilisateur du type de classe vers la même classe.
2) Promotion : promotion intégrale, promotion en virgule flottante
3) Conversion : conversion intégrale, conversion en virgule flottante, conversion en virgule flottante-intégrale, conversion de pointeur, conversion de pointeur à membre, conversion booléenne, conversion définie par l'utilisateur d'une classe dérivée à sa base
Donc, la promotion de char
a int
est préféré à la conversion de char
a short
.
Qu'est-ce que la promotion ? vous pouvez vous demander. Il s'agit d'un type particulier de conversion décrit par la norme.
Pourquoi est-ce que char
a short
pas une promotion ? vous pouvez continuer. Promotion intégrale est toujours de int
ou un caractère plus grand. Il n'y a pas de promotions pour short
.
Les conversions implicites suivantes sont classées comme des promotions intégrales :
-
signed char ou signed short peuvent être convertis en int ;
-
unsigned char ou unsigned short peut être converti en int s'il peut contenir toute sa plage de valeurs, et en unsigned int sinon ;
-
char peut être converti en int ou unsigned int selon le type sous-jacent : signed char ou unsigned char (voir ci-dessus) ;
-
wchar_t, char16_t et char32_t peuvent être convertis dans le premier type de la liste suivante capable de contenir la totalité de leur plage de valeurs : int, unsigned int, long, unsigned long, long long, unsigned long ; un type d'énumération non couvert dont le type sous-jacent n'est pas fixe peut être converti dans le premier type de la liste suivante capable de contenir toute la gamme de valeurs : int, unsigned int, long, unsigned long, long long, ou unsigned long. Si la plage de valeurs est supérieure, aucune promotion intégrale ne s'applique ;
-
un type d'énumération non scopé dont le type sous-jacent est fixe peut être converti en son type sous-jacent promu ;
(depuis C++11)
-
un type de champ binaire peut être converti en int s'il peut représenter toute la plage de valeurs du champ binaire, sinon en unsigned int s'il peut représenter toute la plage de valeurs du champ binaire, sinon aucune promotion intégrale ne s'applique ; le type bool peut être converti en int avec la valeur false devenant 0 et true devenant 1.
Références normalisées (projet de norme actuelle) :
[over.ics.scs] § 3
[prom.conv.] § 1
0 votes
Y a-t-il un problème que vous essayez de résoudre ou est-ce de la pure curiosité ?
4 votes
En (un peu douteux) La raison pour laquelle il n'y a pas de promotion courte est que
int
est considérée comme la taille optimale du processeur/registre,short
juste une disposition de la mémoire emballée. Ainsi, un int ("registre") est utilisé pour traiter unchar
. On suppose qu'une soustraction de short ne serait pas plus efficace qu'une soustraction de int.4 votes
@JoopEggen - ce n'est pas un raisonnement (douteux ou non), c'est une décision de conception : en C et C++,
int
est censé être la taille naturelle de l'architecture, c'est donc ce qu'il faut utiliser lorsqu'il n'y a pas de bonne raison de préférer autre chose.4 votes
@PeteBecker Je voulais formuler la raison pour cette décision de conception. Comme il y avait déjà des réponses citant des références, je ne voulais pas d'une déclaration légaliste.
1 votes
Excellente question +1 ! !!