¿Cuál es la diferencia entre las promociones de números enteros y las conversiones de enteros en C ++

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

Pregunta

Sección 4.5 de la norma C ++ (promoción entero) habla de casos específicos de conversión de tipos integrales a los tipos con un rango más alto.

Sección 4.7 de la C ++ estándar (conversiones integrales) comienza con (bullet 4.7.1):

Un valor p de un tipo entero se puede convertir en un valor p de otro tipo entero. Un valor p de un tipo de enumeración se puede convertir en un valor p de un tipo entero.

Por lo que entiendo conversiones descritas en 4.5 (quizá a excepción de la bala 4.5.3 (enumeraciones)) se puede realizar mediante el uso de las técnicas de 4,7 sección solo: 4.5.1 y 4.5.2 están completamente cubiertos por 4,7. 1; 4.5.4 está cubierta por 4.7.4. Entonces, ¿cuál es el propósito de toda la sección 4.5? Lo conversiones adicionales Qué le permite? Tal vez me falta algunas restricciones?

P.S. Estoy C ++ 03 versión de la norma lectura.

¿Fue útil?

Solución

pensar que la distinción es importante porque tanto no entran en el mismo categoría de conversión y tienen diferentes rango (ver 13.3.3.1 .1, secuencias de conversión estándar). El rango hace una diferencia cuando se trata de resolución de sobrecarga:

secuencias de conversión estándar están clasificadas por sus filas: una coincidencia exacta es una conversión mejor que una promoción, que es una conversión mejor que una conversión.

Al final, creo que es la distinción entre 4.5 y 4.7 que hace que el siguiente código inequívoco:

#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 a int es una promoción (por lo tanto tener rango promoción)
  • short a unsigned short es una conversión (por lo tanto tener rango de conversión)

Al final, este código llama foo(int) porque es un mejor candidato.

Otros consejos

Promociones se producen durante las operaciones aritméticas y otros. Las conversiones se producen cuando simplemente almacenar un tipo integral dentro de otro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top