reinterpret_cast - En C++, ¿cuáles son las diferencias entre static_cast<double>(a) y double(a)?
std::< dynamic_cast (4)
¿Cuáles son las diferencias entre
int a;
// a gets some value
double pi = static_cast<double>(a)/3;
y
int a;
// a gets some value
double pi = double(a)/3;
¿Alguna vez has visto este último? Me parece que lo vi en un fragmento escrito por Stroustrup pero no puedo encontrar la referencia.
Alguien pudo haber pensado que estaban construyendo en lugar de lanzar. Considerar:
some_fun(std::string("Hello"));
Muchas personas piensan que están llamando a un constructor allí cuando, de hecho, están haciendo un reparto de estilo C. Da la casualidad de que el casting buscará a los constructores del tipo de destino en la larga lista de otras cosas que ve y, por lo tanto, aquí finalmente termina invocando al constructor.
Los modelos de notación funcional tienen todas las mismas debilidades del otro tipo de modelo C:
- Inadvertidamente puede desechar constness
- Se puede convertir silenciosamente en un reparto de reinterpretación.
- Son difíciles de diferenciar con las herramientas de grepping.
Además de todo eso, estás realizando exactamente la misma operación en ambos casos.
No hay diferencia en términos de código de ensamblaje generado entre static_cast<double> (a)
y (double) a
. La ventaja clave de la notación de (type_id) cast_expression
, (type_id) cast_expression
, es que es más flexible. En una situación, podría ser el equivalente de un const_cast
; en otra, un static_cast
; en otra, un dynamic_cast
; en otra, una combinación de const_cast
y static_cast
(o dynamic_cast
).
Esta fuerza es también una debilidad. La notación del reparto significa diferentes cosas en diferentes lugares. Otra desventaja es que es muy fácil encontrar xxx_cast<type_id> (cast_expression)
. Sólo busca _cast
. Es muy difícil encontrar expresiones que usen la notación de reparto.
Se hace referencia a esta última como la notación funcional de la conversión explícita en la que se dice explícitamente que a
debe tratarse como un double
. Usted puede prácticamente lanzar cualquier cosa a cualquier tipo usando esta técnica.
La primera es la forma preferida de lanzar un tipo en C ++. Realiza una comprobación básica para ver si el tipo al que está convirtiendo tiene sentido (puntero de clase secundaria a un puntero de clase base, etc.). Además, como en el ejemplo que muestra, puede realizar conversiones implícitas. Técnicamente, el static_cast
en su ejemplo es explícito, pero el resultado de la operación (la asignación) es implícito.
el uso de static_cast es una forma segura de estilo C ++, pero (doble) - una forma insegura de estilo C antigua.
Vea aquí: Tipo de Casting