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.