In C, non è necessario eseguire il cast di a void *
su qualsiasi altro tipo di puntatore, viene sempre promosso in modo sicuro. Tuttavia, in C ++, non è così. Per esempio,
int *a = malloc(sizeof(int));
funziona in C, ma non in C ++. (Nota: so che non dovresti usare malloc
in C ++, o per quello new
, e dovresti invece preferire puntatori intelligenti e / o STL; questo è chiesto per pura curiosità) Perché lo standard C ++ non consente questo cast implicito, mentre lo standard C fa?
sizeof(*a)
invece.
malloc
non può restituire un puntatore al tipo allocato. new
è C ++ che restituisce un puntatore al tipo allocato, quindi il codice C ++ correttamente scritto non avrà mai alcun void *
s da trasmettere.
void
, C no . Quando quella parola / idea è stato aggiunto al C, hanno cambiato per soddisfare le esigenze di C. E 'stato poco dopo tipi di puntatore iniziato ad essere controllati a tutti . Vedi se riesci a trovare il libretto di descrizione C di K&R online o una copia vintage di un testo di programmazione C come C Primer di Waite Group . ANSI C era pieno, con funzionalità backportate o ispirate al C ++, e K&R C era molto più semplice. Quindi è più corretto che il C ++ abbia esteso il C così com'era in quel momento, e il C che sai è stato rimosso dal C ++.
long *a = malloc(sizeof(int));
Oops, qualcuno ha dimenticato di cambiare solo un tipo!