En C, no hay necesidad de lanzar un void *
a ningún otro tipo de puntero, siempre se promociona de forma segura. Sin embargo, en C ++, este no es el caso. P.ej,
int *a = malloc(sizeof(int));
funciona en C, pero no en C ++. (Nota: Sé que no debe usar malloc
en C ++, o para el caso new
, y en su lugar debería preferir los punteros inteligentes y / o el STL; esto se pregunta por pura curiosidad) ¿Por qué el estándar C ++ no permite este lanzamiento implícito, mientras que el estándar C lo hace?
sizeof(*a)
lugar.
malloc
no puede devolver un puntero al tipo asignado. new
si C ++ devuelve un puntero al tipo asignado, por lo que el código C ++ escrito correctamente nunca tendrá ningún void *
s para emitir.
void
, C no . Cuando se añadió la palabra clave / C idea, que cambiaron para adaptarse a las necesidades del C. Eso fue poco después de que los tipos de puntero comenzaron a ser revisados en absoluto . Vea si puede encontrar el folleto de descripción de K&R C en línea, o una copia antigua de un texto de programación en C como el C Primer de Waite Group . ANSI C estaba lleno, con características respaldadas o inspiradas en C ++, y K&R C era mucho más simple. Por lo tanto, es más correcto que C ++ extendiera C tal como existía en ese momento, y que la C que conoces se eliminó de C ++.
long *a = malloc(sizeof(int));
¡Vaya, alguien olvidó cambiar solo un tipo!