c++ casting static-cast

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.