4.9.9b El operador static_cast
§1 Sinopsis
Este es el operador de modelado que se recomienda para todas aquellas situaciones en que está perfectamente definido el tipo de conversión deseado. Se recomienda incluso para aquellos casos en que técnicamente no es necesario un modelado explícito porque el compilador lo realiza automáticamente.
§2 Sintaxis
static_cast<T> (arg)
Ejemplo
int x = 10;
float f = static_cast<float> (x);
§4 Descripción
<T> es el tipo al que se convertirá
(resultado del modelado); puede ser cualquiera de los siguientes: puntero
(
4.2); referencia
(
4.2.3); tipo aritmético
(
2.2.1) o enumeración
(
4.7). Este operando se denomina
tipo del modelado.
arg es el objeto cuyo tipo se desea convertir;
debe ser asimilable al tipo de T (aquí no se pueden pedir imposibles); este operando se denomina argumentodel
modelado. Ambos operandos, el argumento y el tipo (arg y T), deben estar totalmente definidos en tiempo de
compilación.
§5 Si un tipo puede ser convertido en otro mediante algún sistema proporcionado automáticamente por el
lenguaje, utilizar la promoción explícita mediante este operador conduce exactamente al mismo resultado. Por ejemplo:
int x = 10;
float f1 = x;
// promoción facilitada por el compilador
float f2 = static_cast<float> (x); // promición explícita (preferible)
§6 Los enteros (int) pueden ser convertidos a enumeraciones (enum),
pero tenga muy presente que cualquier intento de promover el argumento a un valor que no sea un elemento de la enumeración
(enumerando), proporciona un resultado indefinido. Considere las dos salidas del ejemplo compilado con C++Builder:
#include <iostream.h>
int main() {
enum COLOR { ROJO, VERDE, AZUL};
COLOR c1 = VERDE;
cout << "C1 es color " << c1 << endl;
int x = 2;
// c1 = x; !! Aviso de asignación anómala: int a COLOR
c1 = static_cast<COLOR> (x); // Ok. promoción correcta
cout << "C1 es color " << c1 << endl;
COLOR c2;
int y = 5;
c2 = static_cast<COLOR> (y); // Resultado indefinido (y > AZUL)
cout << "C2 es color " << c2 << endl;
}
Salida:
C1 es color 1
C1 es color 2
C2 es color 5
Observe que en este último caso, el compilador hace adoptar a c2 un valor 5 que es teóricamente imposible para el tipo COLOR, lo que podría dar lugar a errores importantes.
§7 Conversión de punteros
El puntero nulo ( 4.2.1)
es convertido a sí mismo.
El puntero a un objeto tipoX puede ser promovido a puntero a cualquier otro tipoY, pero tenga en cuenta que la mera promoción entre tipos de punteros puede ser motivo de problemas si los tipos equivalentes no están alineados de forma similar.
El resultado de la conversión estática de un puntero es otra referencia al objeto original.
Es posible convertir explícitamente, mediante una conversión estática, un puntero a clase-X a puntero a una clase-Y, si se dan las siguientes condiciones:
- X es una clase base para Y.
- Existe una conversión sin ambigüedades de Y a X
- X no es una clase-base virtual
Un objeto puede ser convertido explícitamente a referencia-a-tipoX si un puntero a tal objeto puede ser explícitamente
convertido a puntero-a-tipoX (tipoX*). El resultado de la conversión es un Lvalue. No son invocados constructores o
funciones de conversión como resultado de un modelado a una referencia.
Un objeto o un valor puede ser convertido a un objeto clase, solo en el caso de que se hayan declarado en la clase un constructor o un operador de conversión adecuados.
Un puntero a miembro (de clase) puede ser convertido explícitamente en puntero a otro tipo de miembro solo si ambos tipos son punteros a miembros de la misma clase, o punteros a miembros de dos clases, una de las cuales es derivada sin ambigüedades de la otra.
§8 Convertir a referencia
Cuando el tipo T es una referencia, el resultado del modelado estático es un Lvalue y se refiere a la expresión
original, aunque este tipo de transformaciones puede resultar peligroso
( 4.2.3).