C++: no se puede static_cast de double*a int*
casting static-cast (5)
Cuando intento usar un static_cast para convertir un doble * en un int *, aparece el siguiente error:
invalid static_cast from type ‘double*’ to type ‘int*’
Aquí está el código:
#include <iostream>
int main()
{
double* p = new double(2);
int* r;
r=static_cast<int*>(p);
std::cout << *r << std::endl;
}
Entiendo que habría problemas al convertir entre un doble y un int, pero ¿por qué hay un problema al convertir entre un doble * y un int *?
Aparte de ser punteros, double*
e int*
no tienen nada en común. Se podría decir lo mismo para los tipos de puntero Foo*
y Bar*
a cualquier estructura diferente.
static_cast
significa que un puntero del tipo de origen se puede usar como un puntero del tipo de destino, que requiere una relación de subtipo.
Debe usar reinterpret_cast
para lanzar punteros, es decir,
r = reinterpret_cast<int*>(p);
Por supuesto, esto no tiene sentido,
¡A menos que quieras echarle un vistazo a un double
! Obtendrás una salida extraña y no creo que esto sea lo que pretendías. Si desea convertir el valor apuntado por p
a un int
, entonces,
*r = static_cast<int>(*p);
Además, r
no está asignado, por lo que puede realizar una de las siguientes acciones:
int *r = new int(0);
*r = static_cast<int>(*p);
std::cout << *r << std::endl;
O
int r = 0;
r = static_cast<int>(*p);
std::cout << r << std::endl;
La conversión de punto a entero flotante es compatible, por lo que int a = static_cast<int>(5.2)
está bien. Sin embargo, es una conversión: los tipos de datos subyacentes son completamente incompatibles. Lo que está pidiendo es que el tiempo de ejecución convierta un puntero a una estructura de 8 bytes en un puntero a una estructura de 4 bytes, que no puede hacer de manera significativa.
Dicho esto, si realmente desea interpretar su doble como un entero, int* r = reinterpret_cast<int*>(p)
funcionará bien.
Porque usaste double *
lugar de double
El *
después de que significa que está declarando un puntero, que es muy diferente de un doble regular.
C ++ no puede static_cast con seguridad un puntero a un tipo diferente de puntero como ese.
Si desea hacer algo así, primero debe eliminar la referencia a la variable.
r=new int(static_cast<int>(*p));
Debe usar new
porque un doble y un entero no pueden residir en el mismo espacio de memoria (sanely)
Puede convertir entre un doble y un int con static_cast<>
, pero no entre punteros a diferentes tipos. Puede convertir cualquier tipo de puntero a o desde void *
con static_cast<>
.
La razón puede ser que int *
y double *
menudo son arreglos efectivamente, y la implementación no sabe qué tan grande es el arreglo.