Question

Section 4.5 du C ++ causeries standard (promotion entier) sur des cas spécifiques de conversion de types intégrés à des types avec un rang plus élevé.

Section 4.7 de la norme C ++ (conversions intégrales) commence par (balle 4.7.1):

  

Un rvalue d'un type entier peut être converti en un autre rvalue de type entier. Un rvalue d'un type d'énumération peut être converti en un rvalue d'un type entier.

Pour autant que je comprends les conversions décrites à la section 4.5 (sauf peut-être pour les balles 4.5.3 (énumérations)) peut être effectuée en utilisant les techniques de 4.7 seule section: 4.5.1 et 4.5.2 sont complètement couvertes par 4,7. 1; 4.5.4 est couvert par 4.7.4. Alors, quel est le but de toute la section 4.5? Que des conversions supplémentaires ne lui permettent? Peut-être que je manque certaines restrictions?

P.S. Je lis C ++ 03 version de la norme.

Était-ce utile?

La solution

penser que la distinction est importante parce que les deux ne tombent pas dans la même catégorie de conversion et ont des rang (voir 13.3.3.1 .1, des séquences de conversion standard). Le rang fait une différence en ce qui concerne la résolution de surcharge:

  

séquences de conversion standard sont commandés par leurs rangs: une correspondance exacte est une meilleure conversion d'une promotion,   qui est une meilleure conversion d'une conversion.

En fin de compte, je crois qu'il est la distinction entre 4,5 et 4,7 qui rend le code suivant sans ambiguïté:

#include <iostream>

void foo(int i)            { std::cout << "foo(int)" << std::endl; }
void foo(unsigned short i) { std::cout << "foo(unsigned short)" << std::endl; }

int main()
{
    foo(static_cast<short>(1));
}
  • short à int est une promotion (donc ayant rang de promotion)
  • short à unsigned short est une conversion (donc ayant rang de conversion)

En fin de compte, ce code appelle foo(int) parce qu'il est un meilleur candidat.

Autres conseils

promotions se produisent au cours des opérations arithmétiques et d'autres. Les conversions se produisent lorsque seulement stocker un type intégré à l'intérieur de l'autre.

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