2011-01-09 19 views
5

La sección 4.5 del estándar C++ (promoción entera) habla sobre casos específicos de conversión de tipos integrales a tipos con un rango más alto.Cuál es la diferencia entre las promociones enteras y las conversiones enteras en C++

Sección 4.7 de la norma C++ (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 de un tipo de enumeración se puede convertir a un valor r de un tipo entero.

Por lo que yo entiendo, las conversiones descritas en 4.5 (tal vez a excepción de la viñeta 4.5.3 (enumeraciones)) se pueden realizar utilizando las técnicas de la sección 4.7 solamente: 4.5.1 y 4.5.2 están completamente cubiertos por 4.7.1; 4.5.4 está cubierto por 4.7.4. Entonces, ¿cuál es el propósito de toda la sección 4.5? ¿Qué conversiones adicionales permite? Tal vez me faltan algunas restricciones?

P.S. Estoy leyendo la versión C++ 03 del estándar.

Respuesta

8

Yo creo que la distinción es importante porque tanto no caen en la categoría de conversión misma y tienen diferentes rango (véase 13.3.3.1.1, secuencias de conversión estándar). El rango hace una diferencia cuando se trata de sobrecargar resolución:

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 teniendo un rango de conversión)

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

4

Las promociones se producen durante la aritmética y otras operaciones. Las conversiones ocurren cuando simplemente se almacena un tipo integral dentro de otro.

+0

Hmm. Entonces si tengo 'unsigned char a; firmado char b; ... short c = a + b', al principio 'a' y' b' son * promovidos * a ints (no) firmados, agregados y luego el resultado es * convertido * a 'short'? –

+0

@buratinas, sí. – AProgrammer

+2

@buratinas: a se promociona a no compartida int, b se promueve a firmado int, luego el resultado de la promoción de b se convierte a unsigned int, luego estos se agregan y el resultado se convierte en short firmado. –

Cuestiones relacionadas